Last active
February 25, 2025 16:33
-
Star
(143)
You must be signed in to star a gist -
Fork
(38)
You must be signed in to fork a gist
-
-
Save joeyAghion/6511184 to your computer and use it in GitHub Desktop.
List mongodb collections in descending order of size. Helpful for finding largest collections. First number is "size," second is "storageSize."
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var collectionNames = db.getCollectionNames(), stats = []; | |
collectionNames.forEach(function (n) { stats.push(db[n].stats()); }); | |
stats = stats.sort(function(a, b) { return b['size'] - a['size']; }); | |
for (var c in stats) { print(stats[c]['ns'] + ": " + stats[c]['size'] + " (" + stats[c]['storageSize'] + ")"); } |
@nenohweg something like datadog?
Also here's a version which works better for me - the versions at the top of this thread *** will silently omit values as they error on system.profile
***
(function() {
const byteUnits = [" kB", " MB", " GB", " TB", "PB", "EB", "ZB", "YB"];
// get collections by size sorted
function getReadableFileSizeString(fileSizeInBytes) {
let i = -1;
do {
fileSizeInBytes = fileSizeInBytes / 1024;
i++;
} while (fileSizeInBytes > 1024);
return Math.max(fileSizeInBytes, 0.1).toFixed(1) + byteUnits[i];
}
const collectionNames = db.getCollectionNames();
let stats = [];
for (const name of collectionNames) {
if (name === 'system.profile') {
continue;
}
stats.push(db.getCollection(name).stats());
}
stats = stats.sort(function(a, b) {
return b["size"] - a["size"];
});
for (let i = 0; i < stats.length; i++) {
console.log(stats[i]["ns"] + ": " + getReadableFileSizeString(stats[i]["size"]) + " (" + getReadableFileSizeString(stats[i]["storageSize"]) + ") - ", Number(stats[i].count).toLocaleString(), " docs");
}
})();
Also includes formatted doc count.
I started with the version from terencehonles, but ran into errors when encountering views. So, I added a filter after getting the collection names to inspect the type to verify it is a collection before calling stats()
.
const readableSize = (size) => {
const scale = (Math.log(size) / Math.log(1024)) | 0;
return (size / Math.pow(1024, scale)).toFixed(3) + ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'][scale];
}
const printStats = (mongo) => {
mongo.getDBNames()
.map((i) => mongo.getDB(i))
.forEach((db) => {
print(db);
print(Array(81).join('='));
db.getCollectionNames()
.filter((i) => (db.getCollection(i).exists() !== null && db.getCollection(i).exists().type === 'collection'))
.map((i) => db.getCollection(i).stats())
.sort((a, b) => b.size - a.size)
.forEach((s) => {
print(`${s.ns}: ${readableSize(s.size)} (${readableSize(s.storageSize)})`);
print(`Indexes: (${readableSize(s.totalIndexSize)})`);
Object.entries({...s.indexSizes}).sort((a, b) => b[1] - a[1]).forEach(([n, s]) => {
print(` ${n}: ${readableSize(s)}`);
});
print('');
});
print('');
});
}
// and used:
printStats(db.getMongo())
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Is there a way to then store this data in a collection as historical data . To monitor collection size growth over a period of time