MongoDB如何对$elemMatch取反?实现指定条件文档排除
MongoDB嵌套数组的排除查询实现
集合结构示例
[ { "id": "1", "companies": [ { "customers": [ { "name": "John", "age": 20 } ] } ] }, { "id": "2", "companies": [ { "customers": [ { "name": "John", "age": 22 } ] } ] }, { "id": "3", "companies": [ { "customers": [ { "name": "Bill", "age": 30 } ] } ] } ]
需求说明
- 仅指定
name="John"时:返回完全没有名为John的客户的文档(仅返回id为3的文档) - 同时指定
name="John"和age=20时:返回不存在名为John且年龄为20的客户的文档(返回id为2和3的文档)
解决方案
1. 单条件排除(仅排除含name=John的客户)
使用$not结合$elemMatch,直接针对嵌套的companies.customers路径做匹配,确保没有任何客户满足name=John的条件:
db.collection.find({ "companies.customers": { $not: { $elemMatch: { name: "John" } } } })
2. 多条件排除(排除含name=John且age=20的客户)
同样用$not+$elemMatch,在$elemMatch中同时指定两个组合条件,这样会排除所有存在符合该条件客户的文档,剩余的就是符合需求的结果:
db.collection.find({ "companies.customers": { $not: { $elemMatch: { name: "John", age: 20 } } } })
失效原因分析
如果之前用$not($elemMatch)没得到预期结果,大概率是没有正确穿透嵌套数组路径——需要直接针对companies.customers层级的数组元素做条件匹配,而非仅在companies层使用$elemMatch(后者只会检查是否有某个companies下的customers数组整体满足条件,而非单个客户)。
内容的提问来源于stack exchange,提问作者arxakoulini
相关产品推荐
相关产品推荐

