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
相关产品推荐
相关产品推荐

