MongoDB中如何从双层嵌套数组获取指定ID的对象数据
如何在MongoDB双层嵌套数组中精准提取目标对象
我是MongoDB新手,想要获取_id为5689746的单个对象数据。我的集合是双层嵌套数组结构,尝试用$elemMatch查询没得到预期结果,希望返回仅包含目标对象的完整嵌套结构。
集合原始数据
[ { "_id": 8965651651, "orditems": [ { "_id": 65748413141, "itms": [ { "item1": "aa", "item2": "bb", "item3": "cc", "_id": 7894567 }, { "item1": "dd", "item2": "ee", "item3": "ff", "_id": 5689746 }, { "item1": "gg", "item2": "hh", "item3": "ii", "_id": 1644824 } ] }, { "_id": 87448413141, "itms": [ { "item1": "jj", "item2": "kk", "item3": "ll", "_id": 9874567 }, { "item1": "mm", "item2": "nn", "item3": "oo", "_id": 8659746 }, { "item1": "pp", "item2": "qq", "item3": "rr", "_id": 4614824 } ] } ] } ]
我之前使用的查询语句
db.orders.findOne({ _id: 8965651651 }, { orditems: { $elemMatch: { _id: 87448413141, itms: { $elemMatch: { _id: 5689746 } } } } })
期望得到的结果
{ "_id": 8965651651, "orditems": [ { "_id": 65748413141, "itms": [ { "item1": "dd", "item2": "ee", "item3": "ff", "_id": 5689746 } ] } ] }
问题分析与解决方案
你之前的查询有两个核心问题:
$elemMatch中指定的orditems._id为87448413141,但目标对象实际在orditems._id为65748413141的子数组中,条件匹配错误。- 即使条件正确,普通投影里的
$elemMatch只能返回数组中第一个匹配的元素,无法深入第二层数组只保留目标子对象,这种多层嵌套的筛选场景需要用聚合框架处理。
以下是能得到预期结果的聚合查询:
db.orders.aggregate([ // 定位目标外层文档,缩小处理范围 { $match: { _id: 8965651651 } }, // 拆解第一层嵌套数组orditems { $unwind: "$orditems" }, // 拆解第二层嵌套数组itms { $unwind: "$orditems.itms" }, // 精准筛选出目标itms对象 { $match: { "orditems.itms._id": 5689746 } }, // 重新组装itms数组,关联到所属的orditems { $group: { _id: { docId: "$_id", ordId: "$orditems._id" }, itms: { $push: "$orditems.itms" } } }, // 重新组装外层orditems数组和文档结构 { $group: { _id: "$_id.docId", orditems: { $push: { _id: "$_id.ordId", itms: "$itms" } } } } ])
执行逻辑说明
$match:先锁定目标外层文档,避免不必要的全表扫描。$unwind:将两层嵌套数组逐个拆解为单条文档,方便后续精准筛选。- 第二次
$match:直接定位到itms._id为5689746的目标对象。 - 两次
$group:按层级重新组装数组,还原成你期望的嵌套结构。
执行该聚合查询后,就能得到符合要求的结果。
内容的提问来源于stack exchange,提问作者manoj sahni
相关产品推荐
相关产品推荐

