MongoDB如何从对象数组中根据_id提取指定对象?
解决MongoDB从数组中提取指定对象及同级元素的问题
嘿,我来帮你搞定这个MongoDB查询的问题!根据你的需求,我整理了几种不同场景下的解决方案,你可以根据实际情况选择:
场景1:只需要匹配_id的对象(仅保留指定字段)
如果你只想获取_id为"1234"的对象,并且只保留它的body、header和_id字段,可以用聚合管道来实现,这样能直接把匹配的对象单独返回:
db.collection.aggregate([ // 先筛选出包含目标_id的文档 { $match: { "blogs._id": "1234" } }, // 展开blogs数组,把每个元素变成独立文档 { $unwind: "$blogs" }, // 精准匹配目标_id的对象 { $match: { "blogs._id": "1234" } }, // 只保留需要的字段 { $project: { _id: "$blogs._id", header: "$blogs.header", body: "$blogs.body" } } ])
执行后你会得到这样的结果:
{ "_id": "1234", "header": "another first", "body": "default valuee" }
场景2:保留原文档结构,同时显示所有同级元素
如果需要返回完整的文档,但blogs数组里既保留所有同级元素,又让匹配的对象只显示指定字段,可以用$map和$cond来处理数组:
db.collection.aggregate([ { $match: { "blogs._id": "1234" } }, { $addFields: { blogs: { $map: { input: "$blogs", as: "blog", in: { $cond: [ { $eq: ["$$blog._id", "1234"] }, // 匹配的对象只返回指定字段 { _id: "$$blog._id", header: "$$blog.header", body: "$$blog.body" }, // 其他同级元素保持原样 "$$blog" ] } } } } } ])
这个查询会返回原文档结构,其中blogs数组里的目标对象只保留你需要的三个字段,其他元素完整保留。
场景3:在原文档中仅展示匹配的对象
如果你想保留原文档结构,但blogs数组里只显示匹配的那个对象(完整字段或指定字段),可以用$elemMatch投影:
显示匹配对象的完整字段
db.collection.find( { "blogs._id": "1234" }, { "blogs": { "$elemMatch": { "_id": "1234" } }, "_id": 0 } )
仅显示匹配对象的指定字段
db.collection.find( { "blogs._id": "1234" }, { "blogs._id": 1, "blogs.header": 1, "blogs.body": 1, "_id": 0 } )
这些方法应该能覆盖你的需求啦,要是还有疑问可以随时问!
内容的提问来源于stack exchange,提问作者kcuhcx2
相关产品推荐
相关产品推荐

