MongoDB多组$or组合查询时为何必须显式使用$and操作符
MongoDB多$or条件需显式声明$and的原因
问题背景
你需要查询满足条件 (成立于2004年 OR 成立于10月) AND (分类为社交 OR 网页) 的数据:
最初的错误写法:
db.companies.find({ $or: [ {"founded_year": 2004}, {"founded_month": 10} ], $or: [ {"category_code": "web"}, {"category_code": "social"} ] }).count()
正确写法:
db.companies.find({ "$and": [ { "$or": [ { "founded_year": 2004 }, { "founded_month": 10 } ] }, { "$or": [ { "category_code": "web" }, { "category_code": "social" }]} ]}).count()
你提到的隐式$and规则确实存在,但该场景下必须显式使用$and操作符,核心原因如下:
具体原因
- 首先是JSON重复键覆盖规则导致错误写法失效:
JSON语法不允许同一个对象内出现重复键名,如果出现重复键,运行环境会直接保留最后一个定义的键值、丢弃前面的同名键值。你最初的查询对象包含两个顶级$or键,MongoDB解析时只会保留最后一个判断分类的$or条件,关于成立时间的第一个$or直接被覆盖,自然查询结果不符合预期。 - 其次是隐式
$and有适用前提:
MongoDB的隐式$and规则仅适用于**不同字段/不同键名的条件并列场景,比如{"founded_year": 2004, "category_code": "web"}这类不同键名的条件,会默认按$and关系拼接。但你需要并列的两个条件都用了$or作为键名,无法触发隐式$and规则。 - 显式声明
$and可以规避重复键问题:
将两个$or条件作为独立元素放到$and对应的数组中,不存在重复键问题,两个条件都能被MongoDB正确解析,符合你需要的逻辑关系。
内容的提问来源于stack exchange,提问作者Neighbourhood
相关产品推荐
相关产品推荐

