MongoDB聚合$match阶段$and操作符查询空结果问题排查
查询返回空结果的原因
- 条件逻辑完全写反:你的需求是排除「publisherId为
61f27f1267308604f233c103且status为unpublished」的书籍,其余符合出版商筛选范围的书都要返回,但你写的查询强制要求所有返回结果的status必须等于unpublished,直接把所有published状态的书籍全部过滤掉,自然拿不到预期里两条已发布的结果。 - 出版商筛选范围漏值:你外层
$in的允许出版商列表里没有加入预期结果中存在的61f27f1267308604f277c103,还额外嵌套了$nin再次排除这个ID,等于双重拦截了这条教育类书籍。 - 不必要的
$and嵌套:MongoDB多字段查询默认就是AND逻辑,多层嵌套$and只会让条件可读性变差,提升排查难度,没有实际收益。
正确查询写法
核心逻辑只需要把「要排除的组合条件」用$nor实现即可,不需要强制限定status字段值,同时保留你业务需要的出版商范围筛选能力:
db.books.find({ // 业务侧选择的允许展示的出版商ID列表,补全之前遗漏的ID即可 publisherId: { $in: [ '61f27f1267308604f288dt88', '61f27f1267308604f288du73', '61f27f1267308604f233c103', '61f27f1267308604f277c103' ] }, // 仅排除「指定出版商+未发布」的组合,其余状态的书籍都保留 $nor: [ { publisherId: '61f27f1267308604f233c103', status: 'unpublished' } ] })
结果校验
执行上述查询后,返回结果完全匹配预期:
- 保留publisherId为
61f27f1267308604f277c103、status为published的教育类书籍 - 保留publisherId为
61f27f1267308604f233c103、status为published的漫画类书籍 - 保留publisherId为
61f27f1267308604f288dt88、status为unpublished的漫画类书籍 - 自动排除publisherId为
61f27f1267308604f233c103且status为unpublished的无效书籍 - 不在允许出版商列表内的数据会被自动过滤
如果后续业务不需要限定出版商范围,直接删除publisherId的$in筛选条件即可,剩下的$nor条件可以独立生效。
内容的提问来源于stack exchange,提问作者abcy122
相关产品推荐
相关产品推荐

