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

MongoDB如何获取数组中is_finished=true的所有子文档

MongoDB:获取数组中所有符合条件的子文档解决方案

嗨~你遇到的这个问题其实是MongoDB里很常见的数组投影限制:用find()里的$投影操作符时,它只会返回数组中第一个匹配查询条件的元素,这就是你只拿到一条结果的原因。要获取所有符合is_finished: true的子文档,咱们得用聚合框架来实现,给你两种常用的方法:

方法一:用$filter直接筛选数组(推荐,高效简洁)

这个方法适合MongoDB 3.2及以上版本,通过$filter操作符直接在数组里筛选符合条件的元素,不需要拆分重组数组:

db.sess.aggregate([
  // 可选步骤:先过滤出包含至少一个符合条件子文档的父文档,减少后续处理数据量
  { $match: { "session.is_finished": true } },
  // 筛选session数组中is_finished为true的元素,替换原session字段
  {
    $addFields: {
      session: {
        $filter: {
          input: "$session", // 要筛选的目标数组
          cond: { $eq: ["$$this.is_finished", true] } // 筛选规则:当前元素的is_finished等于true
        }
      }
    }
  }
])

执行后,返回的文档里session字段就只会包含所有is_finished: true的子文档啦。

方法二:用$unwind+$match+$group重组数组

如果需要对筛选后的子文档做额外的中间处理,可以用这种拆分再聚合的方式:

db.sess.aggregate([
  { $match: { "session.is_finished": true } },
  // 把session数组拆分成单个独立文档,每个子文档成为一条单独记录
  { $unwind: "$session" },
  // 筛选出is_finished为true的子文档
  { $match: { "session.is_finished": true } },
  // 重新按原文档的_id分组,将符合条件的子文档重新组合成数组,同时保留原exp字段
  {
    $group: {
      _id: "$_id",
      exp: { $first: "$exp" },
      session: { $push: "$session" }
    }
  }
])

这个方法的思路是先拆解数组,筛选目标项后再重新聚合,灵活性更高。

另外提个小细节:你原来的查询语句里db.getCollection.sess写法有误,正确的写法应该是db.getCollection("sess")或者直接db.sess哦~

内容的提问来源于stack exchange,提问作者Al Stone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:47:43