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
相关产品推荐
相关产品推荐

