MongoDB查询需求:匹配数组所有元素age<15的文档
解决方案:匹配数组所有元素满足条件的MongoDB查询
你的核心需求是筛选出数组arr内所有元素的age都小于15的文档,而原查询使用$elemMatch是匹配存在至少一个age小于15的元素的文档,逻辑完全相反,因此得到了不符合预期的结果。以下是两种无需JS后处理的查询方案:
方案1:使用$not+$elemMatch反向排除
通过排除掉数组中存在age≥15元素的文档,剩余的就是所有元素age都小于15的文档:
db.collection.find({ "arr": { $not: { $elemMatch: { age: { $gte: 15 } } } } })
针对你的测试数据,所有文档的arr数组都包含age≥15的元素,因此查询结果为空数组,符合预期。
方案2:使用聚合管道$allElementsTrue+$map
通过聚合管道的表达式直接验证数组所有元素是否满足条件:
db.collection.aggregate([ { $match: { $expr: { $allElementsTrue: { $map: { input: "$arr", as: "item", in: { $lt: ["$$item.age", 15] } } } } } } ])
$map遍历arr数组,为每个元素生成age<15的布尔判断结果;$allElementsTrue检查所有布尔结果是否为true,仅当全部满足时保留文档。
原查询问题说明
原查询的$elemMatch: { age: { $lt: 15 } }是匹配存在符合条件的元素,而投影"arr.$":1仅返回数组中第一个匹配的元素,这和你“所有元素满足条件”的需求完全不符,因此需要调整查询条件的逻辑方向。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

