如何在MongoDB中查询字段缺少指定数组任意元素的文档
MongoDB 对应查询写法
要实现「筛选出目标数组存在至少一个元素不在文档指定数组字段中」的查询,最简洁的方案是搭配$not和$all操作符实现:
基础查询写法(适用于普通find查询)
目标数组为["a", "b", "c"]、查询字段为a的示例语句如下:
db.yourCollectionName.find({ a: { $not: { $all: ["a", "b", "c"] } } })
逻辑说明
$all: ["a", "b", "c"]的作用是匹配所有a字段数组同时包含a、b、c三个元素的文档- 外层套
$not做取反,就可以筛选出所有不满足「a字段包含全部三个目标元素」的文档,也就是至少缺少一个目标元素的文档,完全符合你的需求。
聚合管道写法(适用于聚合查询场景)
如果是在聚合管道中使用,可以用$expr搭配$setIsSubset实现相同效果:
db.yourCollectionName.aggregate([ { $match: { $expr: { $not: { $setIsSubset: [["a", "b", "c"], "$a"] } } } } ])
逻辑说明
$setIsSubset([数组1, 数组2]) 用于判断数组1是否是数组2的子集(即数组1的所有元素都存在于数组2中),取反后就等价于「数组1存在至少一个元素不在数组2中」,和基础查询的逻辑一致。
效果验证
和你给出的示例完全匹配:
- 文档
{a: ["a", "b"]}会被正常返回 - 文档
{a: ["a", "b", "c"]}不会被返回
内容的提问来源于stack exchange,提问作者Ferus
相关产品推荐
相关产品推荐

