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

如何在MongoDB中使用find或aggregate获取嵌套数组的匹配对象?

MongoDB查询:过滤嵌套数组仅保留status为true的元素

你用{canReview.status: true}查询只能筛选出包含至少一个status=true元素的文档,但不会修改数组内容——原数组里的false元素依然会保留,这就是没得到期望结果的原因。要实现仅保留数组中status=true的元素,需要结合筛选和数组过滤操作,下面是两种可行方案:

方法一:聚合管道(推荐,支持保留所有匹配元素)

通过$match先筛选出符合条件的文档,再用$filter过滤数组元素,是最通用的解决方案。

db.collection.aggregate([
  // 第一步:排除完全没有status=true元素的文档
  {
    $match: {
      "canReview.status": true
    }
  },
  // 第二步:过滤canReview数组,只保留status为true的元素
  {
    $addFields: {
      canReview: {
        $filter: {
          input: "$canReview",
          cond: { $eq: ["$$this.status", true] }
        }
      }
    }
  }
])

步骤说明:

  • $match阶段:先把像_id=2这类canReview全是false的文档排除,减少后续处理的数据量。
  • $addFields阶段:用$filter遍历canReview数组,只保留满足status=true的元素,替换原数组字段。

运行后得到的结果完全符合你的期望:

[
  {
    "_id": 1,
    "name": "aaaa",
    "canReview": [
      {
        "status": true
      }
    ]
  }
]

方法二:投影(仅适用于数组最多一个匹配元素的场景)

如果你的canReview数组里最多只有一个status=true的元素,可以用$elemMatch在投影中过滤,但这个方法只会返回数组中第一个匹配的元素,无法保留多个匹配项,所以局限性较大。

db.collection.find(
  { "canReview.status": true },
  { "canReview": { $elemMatch: { status: true } }, name: 1, _id: 1 }
)

内容的提问来源于stack exchange,提问作者Atul Pisal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:31:58