Mongoose查询问题:如何筛选无未驳回Issue的记录?
解决方案
要找出所有不存在未被驳回Issue的记录,核心是确保文档里的所有activities条目要么没issue,要么有issue但已经被驳回(dismissed字段存在)。直接用这个Mongoose查询就能实现:
collection.find({ $not: { $elemMatch: { 'issue': { $exists: true }, 'issue.dismissed': { $exists: false } } } })
或者用$nor语法实现等价逻辑:
collection.find({ $nor: [ { $elemMatch: { 'issue': { $exists: true }, 'issue.dismissed': { $exists: false } } } ] })
之前的查询失效原因
第一个查询的问题
你之前把$not嵌套在activities:字段下,这会让MongoDB判断整个activities数组不匹配$elemMatch的条件——但数组只要有一个元素不满足该条件就会触发匹配,这和我们要的“所有元素都不能是未驳回的issue”逻辑完全相反。直接将$not放在查询最外层,才能让MongoDB检查整个文档中是否存在符合条件的activity,不存在则返回该文档。
第二个查询的问题
第二个用$or的写法是针对数组整体的,MongoDB只要发现数组里有一个元素满足activities.issue不存在,或者有一个元素的dismissed存在,就会返回整个文档。但如果文档里同时存在已驳回和未驳回的issue,这个查询还是会把它捞出来,不符合需求。
匹配范围说明
这个查询会精准匹配两类文档:
- 所有activity都没有
issue字段的文档 - 所有activity的
issue都包含dismissed(已被驳回)的文档
完全覆盖你要的“不存在未被驳回Issue”的场景。
内容的提问来源于stack exchange,提问作者frostycoles
相关产品推荐
相关产品推荐

