Last active
October 10, 2024 21:34
-
-
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 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'] + ")"); } |
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
@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
Try this to get all DBs, collections and document count:
mongo --eval " db.getMongo().getDBNames().forEach( function(v, i){ db.getSiblingDB(v).getCollectionNames().forEach( function(vv, ii){ print (v + ',' + vv + ',' + db.getSiblingDB(v).getCollection(vv).count() ) } ) } ) "