我试图在 MongoDB 中找到每个数据库中大小超过 1GB 的每个集合,并打印数据库名称、集合名称、集合大小。 我为它编写了一个javascript,它适用于数据库较少的mongo,但在生产中尝试脚本时它会关闭mongo。看来该查询在性能方面并不是很好。
这是我写的javascript:
db.getMongo().getDBNames().forEach(function(dbName){
db.getMongo().getDB(dbName).getCollectionNames().forEach(function(collName){
var coll = db.getMongo().getDB(dbName).getCollection(collName);
var collSize = coll.stats(1024*1024*1024).storageSize;
if (collSize > 1) {
print(dbName + ":" + collName + ":" + collSize);
}
})
})
有什么办法可以改善吗?
谢谢
这从
mongosh
或 mongo
shell 运行:
var dbNames = db.adminCommand({ listDatabases: 1, nameOnly: true })["databases"].map(d => d.name);
for (let dbname of dbNames) {
db.getSiblingDB(dbname)
.getCollectionNames()
.forEach(coll => {
let size = db.getCollection(coll).stats(1024*1024*1024).storageSize;
if (size > 1)
print(dbname + " : " + coll + " : " + size);
});
};
有几个方面可以提高性能:
.getMongo
返回当前连接,该连接已经通过 db
我已应用这些更改来创建此脚本,该脚本在一系列已加载集群上运行时没有明显的性能问题。
const dbNames = db.adminCommand({ listDatabases: 1, nameOnly: true })["databases"].map(d => d.name);
for (const dbName of dbNames) {
const currentDb = db.getMongo().getDB(dbName);
currentDb.getCollectionNames().forEach(collName => {
const coll = currentDb.getCollection(collName);
const collSize = coll.stats(1024 * 1024 * 1024).storageSize;
if (collSize > 1) {
print(dbName + ":" + collName + ":" + collSize);
}
});
}