MongoDB布尔逻辑查询重复键问题解决及复合查询写法
MongoDB重复逻辑键问题解决与正确查询写法
问题原因
你写的查询里出现了两个顶级$or键,MongoDB解析查询文档时,重复的顶级键会被后面的覆盖,所以只会执行第二个$or的条件,同时触发重复键警告。
解决方法与正确查询写法
需求是**(AttributeA匹配criteria1 或 AttributeB匹配criteria2) 且 (AttributeC匹配criteria3/4/5/6)**,需要用$and把两组条件组合起来,同时AttributeC的多值匹配可以用$in简化(比嵌套$or更高效易读):
db.Example.find({ $and: [ { $or: [{ AttributeA: criteria1 }, { AttributeB: criteria2 }] }, { AttributeC: { $in: [criteria3, criteria4, criteria5, criteria6] } } ] })
如果坚持用$or处理AttributeC的多值匹配(不推荐),写法如下:
db.Example.find({ $and: [ { $or: [{ AttributeA: criteria1 }, { AttributeB: criteria2 }] }, { $or: [{ AttributeC: criteria3 }, { AttributeC: criteria4 }, { AttributeC: criteria5 }, { AttributeC: criteria6 }] } ] })
关键说明
- 顶级查询文档里不能有重复的操作符键(比如多个
$or),必须用$and/$or这类逻辑操作符把多组条件嵌套起来。 - 同一字段匹配多个固定值时,
$in是最优选择,性能和可读性都优于多个$or子句。
内容的提问来源于stack exchange,提问作者Owen S
相关产品推荐
相关产品推荐

