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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:13:19