MongoDB查询:找出arrayProperty元素全在指定数组中的文档
查询MongoDB中数组所有元素都包含在指定数组的文档
要实现这个需求,我们可以用两种实用的方式来编写查询语句,下面结合你的示例数据详细说明:
方法一:使用$setIsSubset(MongoDB 3.2+ 推荐)
$setIsSubset操作符可以直接判断一个数组是否是另一个数组的子集,完美匹配我们的需求——检查arrayProperty的所有元素都包含在指定数组中。
查询语句如下:
db.yourCollectionName.find({ $expr: { $setIsSubset: ["$arrayProperty", ["1", "2", "3", "4"]] } })
原理说明
$setIsSubset: [A, B]会返回true当且仅当数组A中的每一个元素都存在于数组B中。代入你的场景,就是判断arrayProperty(即$arrayProperty)是否是指定数组["1","2","3","4"]的子集,逻辑直观又清晰。
方法二:使用$not + $elemMatch + $nin(兼容旧版本)
如果你的MongoDB版本低于3.2,可以用这种组合方式来实现需求:
查询语句如下:
db.yourCollectionName.find({ arrayProperty: { $not: { $elemMatch: { $nin: ["1", "2", "3", "4"] } } } })
原理说明
$nin: ["1","2","3","4"]会匹配不在指定数组中的元素;$elemMatch会找到至少有一个元素满足上述条件的文档(也就是存在元素不在指定数组的文档);- 最后用
$not取反,就得到了所有元素都在指定数组中的文档。
验证你的示例数据
用上述任意一种查询,针对你提供的示例文档:
_id: "1"的arrayProperty: ["1","2"]→ 所有元素都在指定数组,会被返回;_id: "2"的arrayProperty: ["1","4"]→ 所有元素都在指定数组,会被返回;_id: "3"的arrayProperty: ["1","7","8"]→ 包含"7""8"不在指定数组,被排除;_id: "4"的arrayProperty: ["1","9"]→ 包含"9"不在指定数组,被排除;
完全符合你期望的结果。
内容的提问来源于stack exchange,提问作者Monta
相关产品推荐
相关产品推荐

