You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB带连字符集合名在Bash脚本中统计数据异常求助

修复MongoDB批量统计脚本的0计数/undefined大小问题

问题现象

运行给定的Bash脚本批量统计MongoDB非系统集合的文档数和数据大小时,所有目标集合都返回0 document(s),大小显示为undefined,示例输出如下:

test_1 - 0 document(s) & Collections Size: undefined Byte(s)
test_2 - 0 document(s) & Collections Size: undefined Byte(s)
test_3 - 0 document(s) & Collections Size: undefined Byte(s)

问题根源

脚本里的db.getCollection("name").count()和db.getCollection("name").dataSize()犯了核心错误:这里的"name"是字符串常量,不是循环中遍历集合名的变量name。MongoDB会尝试查找一个真名叫name的集合(几乎不存在),因此返回0个文档,dataSize()因找不到集合返回undefined。

另外原脚本的if语句未加大括号,导致只有var collectionCount = ...一行受条件控制,collectionSize的获取和打印操作会无视system集合的过滤条件,这也是潜在的逻辑漏洞。

修复后的完整脚本

mongo --host=$MONGO_HOST --port=$MONGO_PORT --username=$MONGO_USER --password=$MONGO_PASSWD --authenticationDatabase $DB_NAME --quiet --eval \
'var databases = db.getMongo().getDBNames();
  for(var i in databases){
    db = db.getMongo().getDB( databases[i] );
    if(db.getName() == "admin" || db.getName() == "config" || db.getName() == "local") {
        print("skipping db " + db.getName());
        continue;
    }
    print("----------------------")
    print("Using Database: " + databases[i]);
    var collections = db.getCollectionNames();
    for(var j = 0; j < collections.length; j++){
      var name = collections[j];
      if(name.substr(0, 6) != "system") {
        var collectionCount = db.getCollection(name).count();
        var collectionSize = db.getCollection(name).dataSize();
        print(name + " - " + collectionCount +  " document(s)" + " & Collections Size: " + collectionSize + " Byte(s)");
      }
    }
  }'

关键修改点

  • 将db.getCollection("name")改为db.getCollection(name):去掉引号,使用循环变量name动态指向当前遍历的集合
  • 给if语句添加{}:确保过滤system集合的条件能覆盖计数、大小获取和打印的全部逻辑

内容的提问来源于stack exchange,提问作者Nagaraj G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:34:58