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

MongoDB查询:筛选内嵌数组所有元素满足指定值的文档

MongoDB 查询:筛选内嵌数组所有元素foo属性均为true的文档

要实现仅返回内嵌objects数组中所有元素的foo属性都等于true的文档(数组中存在元素无foo属性或foo≠true则排除),可以用以下两种方法:

方法1:反向排除不符合条件的文档

通过$not结合$elemMatch,排除存在不符合要求元素的文档,剩下的就是全部元素符合条件的文档:

db.collection.find({
  $not: {
    $elemMatch: {
      $or: [
        { foo: { $ne: true } },
        { foo: { $exists: false } }
      ]
    }
  }
})

逻辑说明

  • $elemMatch会匹配数组中任意一个满足以下条件的元素:foo不等于true,或者foo属性不存在
  • $not对上述匹配结果取反,最终得到所有元素都满足foo存在且等于true的文档

方法2:使用聚合表达式验证所有元素(MongoDB 3.2+)

利用$expr结合$allElementsTrue和$map,直接验证数组所有元素的foo值:

db.collection.find({
  $expr: {
    $allElementsTrue: {
      $map: {
        input: "$objects",
        as: "obj",
        in: { $eq: ["$$obj.foo", true] }
      }
    }
  }
})

逻辑说明

  • $map遍历objects数组,将每个元素转换为foo是否等于true的布尔值,生成一个布尔数组
  • $allElementsTrue检查这个布尔数组是否所有元素都是true,只有全部为true的文档才会被选中

示例验证

假设集合数据如下:

[
  { _id: 1, objects: [{ foo: true }, { foo: false }] },
  { _id: 2, objects: [{ foo: true }, { bar: "test" }] },
  { _id: 3, objects: [{ foo: true }, { foo: true }] }
]

运行上述任意查询,都会仅返回_id: 3的文档,符合需求。

内容的提问来源于stack exchange,提问作者Denys Siebov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:12:35