如何在MongoDB中筛选数组所有元素满足条件的文档?
解决MongoDB查询数组所有元素满足范围条件的问题
你的核心需求是返回ratings数组中每一个元素都大于8且小于10的文档,但当前使用的$elemMatch只能匹配数组中至少存在一个符合条件的元素,这就是你得不到预期结果的原因。
正确的查询方式
方法1:用$not排除不符合条件的元素
通过排除数组中存在<=8或>=10的元素,间接实现“所有元素都在(8,10)区间”的要求:
db.Practicelab2.find({ $and: [ { ratings: { $not: { $elemMatch: { $lte: 8 } } } }, { ratings: { $not: { $elemMatch: { $gte: 10 } } } } ] })
方法2:使用聚合表达式(MongoDB 3.2+支持)
利用$expr结合$allElementsTrue和$map,直接检查数组中所有元素是否满足条件:
db.Practicelab2.find({ $expr: { $allElementsTrue: { $map: { input: "$ratings", as: "rating", in: { $and: [ { $gt: [ "$$rating", 8 ] }, { $lt: [ "$$rating", 10 ] } ] } } } } })
原查询不生效的原因
原查询db.Practicelab2.find({ratings: {$elemMatch:{$gt:8, $lt:10}}})会返回所有ratings数组中至少有一个元素在8到10之间的文档——比如你提供的两个示例文档里都有9,所以都会被匹配到,但它们的ratings里还有10,不符合“所有元素都满足条件”的要求。
测试说明
你提供的两个示例文档的ratings数组都包含10(不满足<10的条件),所以使用上述正确查询后,这两个文档都不会被返回。如果有一个文档的ratings是[9,9.5],则会被正确匹配。
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

