You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:40:35