如何在Mongoose中通过find()按层级查询指定_id的data子文档
如何用Mongoose查询嵌套数组中指定_id的子文档
针对你的文档结构,要直接获取data数组中_id为"abc"的单个子文档,有两种实用方法:
方法一:使用聚合管道(推荐,直接返回目标格式)
通过MongoDB的聚合操作可以精准筛选并提取目标子文档,代码示例如下:
const result = await myModel.aggregate([ // 匹配包含目标子文档的父文档 { $match: { "data._id": "abc" } }, // 拆分data数组,将每个子文档转为单独的文档 { $unwind: "$data" }, // 筛选出_id为abc的子文档 { $match: { "data._id": "abc" } }, // 只保留需要的字段,去除父文档的其他属性 { $project: { _id: 0, name: "$data.name", "_id": "$data._id" } } ]); // 聚合返回数组,取第一个元素就是目标子文档 const targetDoc = result[0];
执行后targetDoc就是你想要的格式:{ "name":"my name 1", "_id":"abc" }
方法二:使用find配合投影,再提取子文档
如果想用find方法,可以先筛选出包含目标子文档的父文档,再通过投影只返回匹配的子文档,最后提取出来:
const parentDocs = await myModel.find( { "data._id": "abc" }, // 匹配条件:data数组中存在_id为abc的子文档 { "data.$": 1, _id: 0 } // 投影:只返回匹配的第一个子文档,不返回父文档的_id ); // 提取数组中的目标子文档 const targetDoc = parentDocs[0]?.data[0];
这种方法需要额外一步提取操作,但写法相对简洁。
注意:如果集合中可能存在多个父文档包含
_id为"abc"的子文档,聚合管道会返回所有匹配的子文档,你可以添加{ $limit: 1 }阶段来只取第一个结果。
内容的提问来源于stack exchange,提问作者Juan Carlos Ajahuana Quispe
相关产品推荐
相关产品推荐

