如何编写MongoDB的$all与$in组合查询
实现MongoDB数组全包含校验的正确查询语句
嘿,我注意到你给出的示例查询语法有问题——$all和$in这么嵌套使用是不符合MongoDB语法规则的。咱们来修正一下,精准实现「校验某数组字段的所有元素都存在于指定目标数组中」的需求:
核心解决方案:使用$expr + $setIsSubset
MongoDB的聚合运算符$setIsSubset可以直接判断第一个数组是否是第二个数组的子集,刚好匹配你的需求。结合$expr就能在查询条件中使用这个聚合表达式,具体语句如下:
db.getCollection('Transactions').find({ $expr: { $setIsSubset: ["$BusinessUnitids", ["item1", "item2", "item3"]] } });
语句解释:
$expr:允许在查询过滤器中使用聚合管道表达式,让我们能调用$setIsSubset这类聚合运算符$setIsSubset: [A, B]:当数组A的所有元素都存在于数组B中时,返回true,对应的文档会被匹配出来"$BusinessUnitids":用字段引用语法指定要校验的数组字段["item1", "item2", "item3"]:替换成你实际用来做校验的目标数组
可选:排除空数组的情况
如果你的业务场景需要排除BusinessUnitids为空数组的文档(因为空数组默认是任何数组的子集),可以再加一个过滤条件:
db.getCollection('Transactions').find({ BusinessUnitids: { $ne: [] }, // 排除空数组 $expr: { $setIsSubset: ["$BusinessUnitids", ["item1", "item2", "item3"]] } });
为什么你的原示例不对?
你写的{ BusinessUnitids: { $all: { $in: [item1, item2, item3] } } }存在两个问题:
$all的参数必须是一个数组,不能嵌套$in操作符$all的作用是「匹配数组字段包含所有指定元素的文档」,但它不限制字段数组里是否有其他不在指定列表中的元素——这和你要的「所有元素都在目标数组里」是完全相反的逻辑
内容的提问来源于stack exchange,提问作者Serhii Melnyk
相关产品推荐
相关产品推荐

