MongoDB数组子对象过滤异常:排除指定组合却返回空集合
问题分析与解决方案
你的需求是排除chars数组中存在同时满足count=2且color=blue的子对象的文档,但之前的两个查询逻辑都错了,导致目标文档被错误过滤:
为什么之前的查询无效?
MongoDB对数组字段的单条件查询(比如chars.count: {$ne:2}),是检查数组中是否存在任意元素符合条件,而非要求所有元素都符合:
- demo1的
$or查询:要求数组里没有count=2的元素,或者没有blue的元素。但你的目标文档里既有count=2的元素(green那条),也有blue的元素(count=3那条),两个条件都不满足,所以文档被过滤。 - demo2的
and查询:要求数组里既没有count=2的元素,也没有blue的元素。显然你的目标文档不满足这两个要求,因此被过滤。
正确的查询写法
要实现“排除存在{count:2, color:"blue"}子对象的记录”,需要用$elemMatch来匹配同时满足两个条件的子对象,再结合$not或$nor来排除这类文档:
写法1:使用$not + $elemMatch
{ "chars": { "$not": { "$elemMatch": { "count": 2, "color": "blue" } } } }
写法2:使用$nor
{ "$nor": [ { "chars": { "$elemMatch": { "count": 2, "color": "blue" } } } ] }
这两种写法都会保留那些chars数组中没有任何一个子对象同时满足count=2和color=blue的文档,你的目标文档会被正确返回。
内容的提问来源于stack exchange,提问作者M-A-X
相关产品推荐
相关产品推荐

