MongoDB如何修正遍历全库全集合查询指定key是否存在的脚本
问题原因
- 你对
find()的返回值理解有误:db[col].find({})返回的是集合中的完整文档对象,不是文档的字段名,所以你直接拿field == "testKey"对比永远不会触发条件 - 原实现遍历全集合所有文档,效率极低,完全不需要逐行扫描文档,MongoDB支持直接通过查询运算符判断字段是否存在
- 原脚本没有打印对应数据库名称,不符合需求,还存在多余的闭合符号语法错误
修正后的可用脚本
db = db.getSiblingDB("admin"); const targetKey = "testKey"; const dbs = db.runCommand({ "listDatabases": 1 }).databases; dbs.forEach(database => { const currentDb = db.getSiblingDB(database.name); const cols = currentDb.getCollectionNames(); cols.forEach(col => { // 跳过系统内置集合,不需要的话可以删掉下面这行 if (col.startsWith("system.")) return; // 只要匹配到一条包含目标字段的文档就返回,无需遍历全集合 const hasKey = currentDb[col].findOne({ [targetKey]: { $exists: true } }) !== null; if (hasKey) { print(`数据库:${database.name},集合:${col} 存在字段${targetKey}`); } }); });
补充说明
如果需要查询嵌套层级的字段,直接修改targetKey的值为完整嵌套路径即可,比如"user.profile.testKey",$exists运算符天然支持嵌套字段的存在性校验。
内容的提问来源于stack exchange,提问作者Viraj
相关产品推荐
相关产品推荐

