如何编写Mongo Shell查询判断多个条件中是否超一个成立?
MongoDB查询:匹配多个条件中至少两个为真的文档
核心思路
利用$expr在查询阶段嵌入聚合表达式,通过$sum统计满足条件的条目数量,再判断总数是否≥2。这种方式既支持布尔属性检查,也能适配任意自定义条件(如数值比较、字符串匹配等)。
布尔属性场景示例
针对你提供的包含布尔属性的文档结构,查询至少两个属性为true的文档:
db.applicationState.find({ $expr: { $gte: [ { $sum: [ { $cond: ["$property1", 1, 0] }, { $cond: ["$property2", 1, 0] }, { $cond: ["$property3", 1, 0] } ] }, 2 ] } })
$cond将每个布尔属性转换为1(true)或0(false)$sum累加所有转换后的值$gte判断累加结果是否≥2,满足则返回该文档
任意自定义条件场景示例
如果需要检查的不是布尔属性,而是复杂判断条件(比如数值范围、字符串长度等),只需将$cond的第一个参数替换为对应条件即可。例如,匹配以下至少两个条件的文档:
propertyA大于100propertyB等于"active"propertyC字符串长度超过5
查询语句如下:
db.applicationState.find({ $expr: { $gte: [ { $sum: [ { $cond: [{ $gt: ["$propertyA", 100] }, 1, 0] }, { $cond: [{ $eq: ["$propertyB", "active"] }, 1, 0] }, { $cond: [{ $gt: [{ $strLenCP: "$propertyC" }, 5] }, 1, 0] } ] }, 2 ] } })
注意事项
- 该方案要求MongoDB版本≥3.6(
$expr从3.6版本开始支持) - 条件数量可灵活增减,只需在
$sum的数组中添加或移除对应的$cond条目即可
内容的提问来源于stack exchange,提问作者Tim Hardy
相关产品推荐
相关产品推荐

