如何在MongoDB集合中查询含bool1或bool2为true的文档?
MongoDB查询任意位置bool1或bool2为true的文档
针对你这种嵌套动态键的文档结构,普通固定路径查询无法覆盖所有可能的bool1/bool2位置,需要用MongoDB的聚合表达式结合$expr实现遍历判断。
正确查询命令(兼容全版本)
db.dbname.find({ $expr: { $anyElementTrue: [ { $reduce: { input: { $objectToArray: "$data groups" }, initialValue: [], in: { $concatArrays: [ "$$value", { $map: { input: "$$this.v", as: "clientItem", in: { $anyElementTrue: [ { $reduce: { input: { $objectToArray: "$$clientItem.data" }, initialValue: [], in: { $concatArrays: [ "$$value", [ "$$this.v.bool1", "$$this.v.bool2" ] ] } } } ] } } } ] } } } ] } })
代码逻辑说明
$objectToArray: "$data groups":将动态键组成的"data groups"对象转为键值对数组,实现对group1、group2等动态分组的遍历。- 外层
$reduce:遍历每个分组下的客户端条目,收集所有bool字段的判断结果。 $map:处理每个客户端条目里的data字段,同样用$objectToArray转换为数组,遍历subgroup76、subgroup77等动态子分组。- 内层
$reduce:将每个子分组中的bool1、bool2值收集到数组中。 $anyElementTrue:只要数组内存在一个true,即判定该文档符合查询条件。
简化版本(MongoDB 5.0+支持)
如果你的MongoDB版本为5.0及以上,可使用$function自定义递归函数,代码可读性更强:
db.dbname.find({ $expr: { $function: { body: function(doc) { function checkBool(obj) { if (typeof obj !== 'object' || obj === null) return false; if ('bool1' in obj && obj.bool1) return true; if ('bool2' in obj && obj.bool2) return true; for (let key in obj) { if (checkBool(obj[key])) return true; } return false; } return checkBool(doc['data groups']); }, args: [ "$$ROOT" ], lang: "js" } } })
该函数会递归遍历"data groups"下所有嵌套对象,只要找到任意bool1或bool2为true的字段,就返回true匹配文档。
内容的提问来源于stack exchange,提问作者John doe
相关产品推荐
相关产品推荐

