如何使用MongoDB查询筛选qty数组所有num均大于50的文档?
实现方法
可以通过MongoDB查询实现,以下是两种常用方法:
方法一:使用$not + $elemMatch直接查询
核心思路是排除所有包含qty.num ≤ 50元素的文档,剩下的就是所有qty.num都大于50的文档。
查询语句:
db.collection.find({ qty: { $not: { $elemMatch: { num: { $lte: 50 } } } } })
逻辑说明
$elemMatch: { num: { $lte: 50 } }:匹配数组中至少存在一个num小于等于50的文档$not:对上述条件取反,即筛选出不存在任何num≤50的文档,也就是所有qty元素的num都大于50
方法二:使用聚合查询($expr + $allElementsTrue + $map)
通过聚合表达式逐元素验证条件,适合更复杂的数组判断场景。
聚合语句:
db.collection.aggregate([ { $match: { $expr: { $allElementsTrue: { $map: { input: "$qty", as: "item", in: { $gt: ["$$item.num", 50] } } } } } } ])
逻辑说明
$map:遍历qty数组,对每个元素生成一个布尔值(num>50则为true,否则为false)$allElementsTrue:判断上述生成的布尔数组是否全为true,即所有元素的num都大于50$match:只保留满足上述条件的文档
验证结果
针对你提供的示例文档:
- 文档
xyz(_id:5234cc89...)和efg(_id:5234ccb7...)因存在num≤50的元素会被排除 - 文档
abc(_id:5234cc8a...)会被正常返回,符合你的期望结果
内容的提问来源于stack exchange,提问作者Canvas
相关产品推荐
相关产品推荐

