MongoDB数组查询能否用$and/$or?为何第一种写法报错?
在MongoDB数组查询中使用$or/$and的正确姿势
首先明确回答你:MongoDB查询数组时完全可以使用$or、$and逻辑运算符,但必须遵循MongoDB对运算符层级的要求。你遇到的第一种写法报错,核心原因是用错了$or的位置。
咱们来拆解两种写法的区别:
为什么第一种写法会报错?
看你写的错误查询语句:
db.inventory.find( { dim_cm: {$or: [ {$gt: 49}, {$size: 1} ] } } )
这里你把$or放在了dim_cm字段的查询条件内部,但$or(包括$and)属于顶级查询运算符——它们的作用是组合多个独立的查询条件文档,而不是作为单个字段的匹配规则。
MongoDB的字段级运算符(比如$gt、$size、$in这些)才是用来定义单个字段的匹配逻辑的,$or不属于这个范畴,所以MongoDB会识别为“未知运算符”,抛出unknown operator $or的错误。
正确写法的逻辑是什么?
你改用的查询语句:
db.inventory.find( { $or: [{dim_cm: {$gt: 49}}, {dim_cm: {$size: 1}}] } )
这里$or作为顶级运算符,正确地组合了两个独立的查询条件:
- 第一个条件:
dim_cm数组中存在至少一个大于49的元素($gt作用于数组时,只要数组里有元素满足条件就匹配) - 第二个条件:
dim_cm数组的长度恰好为1($size专门匹配数组的长度)
这种写法符合MongoDB的查询语法规范,所以能正常返回结果。
补充小知识点
如果是针对同一个字段的多个条件需要同时满足(逻辑与),其实不需要显式用$and——单个字段下的多个运算符默认就是逻辑与关系。比如要查询dim_cm数组长度为1且元素大于49,直接写:
db.inventory.find( { dim_cm: {$gt: 49, $size: 1} } )
就可以达到和$and组合相同的效果。
内容的提问来源于stack exchange,提问作者Radek Micek
相关产品推荐
相关产品推荐

