报告所有数据库及其在 MongoDB 中的集合大小

问题描述 投票:0回答:2

我试图在 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);
        }
    })
})

有什么办法可以改善吗?

谢谢

mongodb collections size
2个回答
0
投票

这从

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); 
    });
};

0
投票

有几个方面可以提高性能:

  1. 使用临时变量来存储DB和集合,以避免重复查询重新访问它们
  2. 避免
    .getMongo
    返回当前连接,该连接已经通过
    db
  3. 间接可用

我已应用这些更改来创建此脚本,该脚本在一系列已加载集群上运行时没有明显的性能问题。

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);
        }
    });
  }
© www.soinside.com 2019 - 2024. All rights reserved.