MongoDB嵌套文档使用$ne的查询异常问题及解决方案
问题解答
一、原查询的执行逻辑及问题
你写的db.students.find({"data.a": {$ne: 1}, "data.b": {$ne: 2}}),实际逻辑是查找**数组里所有元素都没有a=1,并且所有元素都没有b=2**的文档。
但MongoDB对数组字段的查询是跨元素匹配的:只要数组里有任意一个元素的a=1,就会导致"data.a": {$ne:1}条件不满足;只要有任意一个元素的b=2,"data.b": {$ne:2}条件就不满足。
拿id=2的文档来说,它的data里有个元素a=1,直接不符合第一个条件,所以被排除了,这就是结果里没它的原因。
二、正确的查询方式
你要的是排除数组中存在同时满足a=1且b=2的单个元素的文档,需要用$not结合$elemMatch来精准匹配单个元素的组合条件:
db.students.find({ data: { $not: { $elemMatch: { a: 1, b: 2 } } } })
逻辑说明
$elemMatch专门用来检查数组里是否存在**单个元素同时符合a=1和b=2**这个组合条件$not对这个条件取反,也就是筛选出数组里根本不存在这种元素的文档- 这样id=2的文档(它的
data元素是{a:1,b:3},不满足a=1且b=2)会被保留,同时排除id=1和id=4这两个包含目标组合的文档,最终返回id=2、3、5的文档
另外还有等价写法,用$nor实现:
db.students.find({ $nor: [ { data: { $elemMatch: { a: 1, b: 2 } } } ] })
内容的提问来源于stack exchange,提问作者Sangeeth K
相关产品推荐
相关产品推荐

