【问题标题】:Reporting All Databases with Their Collection Sizes in MongoDB在 MongoDB 中报告所有数据库及其集合大小
【发布时间】:2022-01-06 04:35:39
【问题描述】:

我试图在 MongoDB 中查找大小超过 1GB 的每个 db 中的每个集合,并打印 dbname、集合名称、集合大小。 我为它写了一个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


    【解决方案1】:

    这从mongoshmongo 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。当我在输入 mongo 时更改数据库时,它会正确返回大小。
    • 当你启动 mongo shell 时,默认数据库是test。您可以通过输入db 来了解它。我尝试了默认 test 数据库中的代码,并更改为另一个数据库 (use other_db),结果相同。当然,我拥有的数据库和集合很小,只有几十个——我用过size = db.getCollection(coll).stats().storageSize
    • 请告知集群信息(MongoDB版本和集群类型)。还要告诉是否启用了身份验证,以及在这种情况下用户在运行上述命令时拥有什么样的权限。请注意,我从独立的 MongoDB v4.2.8 运行脚本,并启用了身份验证 not
    • 你好,我也在非集群Mongo上试过,这是我们的测试环境。如您所说,默认数据库是测试。我也在这个 4.0.27 版本的 Mongo 上运行脚本,同样的事情。数据全部用于测试数据库的集合,我将发布一个输出作为新答案,不能在这里做。我正在使用 --authenticationDatabase="admin" 选项 btw 运行 mongo
    猜你喜欢
    • 2023-02-02
    • 2020-04-19
    • 2021-11-11
    • 1970-01-01
    • 2016-11-06
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多