MongoDB中如何将嵌套文档字段值提取至顶层文档展示
从MongoDB文档提取嵌套字段并迁移至顶层
需求说明
需要对目标MongoDB文档完成以下处理:
- 提取
EAddress下的State字段,重命名为顶层字段EAddressState - 提取
EAddress.OfficeAddress下的State和PinCode字段,分别重命名为顶层字段EOfficeState、EOfficePinCode - 从
EFevMovieDetails数组中筛选出MoveName为"Krish"的条目,将其MoveName值设为顶层字段EWantedToWatchAgainIfWeOffer
原始文档
{ "_id" : ObjectId("635cbfee36945e4a79b0af70"), "EID" : 200, "EName" : "ram Kumar", "ESalary" : 50000, "EAddress" : { "AddL1" : "fjwh fhwi fijwo", "AddL2" : "uifwi efvhe", "City" : "Blr", "State" : "Karnataka", "PinCode" : 560103, "OfficeAddress" : { "AddL1" : "bhr", "State" : "Hyderabad", "PinCode" : 125465, "OfficeName" : "HCLN" } }, "EFevMovieDetails" : [ { "MoveName" : "ROBO 1.0", "WatchedDate" : "10/01/2022" }, { "MoveName" : "DDLJ", "WatchedDate" : "01/01/2020" }, { "MoveName" : "Krish", "WatchedDate" : "01/01/2015" } ] }
期望结果
{ "_id" : ObjectId("635cbfee36945e4a79b0af70"), "EID" : 200, "EName" : "ram Kumar", "ESalary" : 50000, "EAddressState" : "Karnataka", "EOfficeState" : "Hyderabad", "EOfficePinCode" : 125465, "EWantedToWatchAgainIfWeOffer" : "Krish" //MovieName must be available within the object "EFevMovieDetails" }
实现方案
使用MongoDB聚合管道的$project阶段完成字段提取、重命名,结合$filter和$arrayElemAt处理数组筛选逻辑:
db.collection.aggregate([ { $project: { EID: 1, EName: 1, ESalary: 1, EAddressState: "$EAddress.State", EOfficeState: "$EAddress.OfficeAddress.State", EOfficePinCode: "$EAddress.OfficeAddress.PinCode", EWantedToWatchAgainIfWeOffer: { $arrayElemAt: [ { $map: { input: { $filter: { input: "$EFevMovieDetails", cond: { $eq: ["$$this.MoveName", "Krish"] } } }, as: "item", in: "$$item.MoveName" } }, 0 ] } } } ])
代码逻辑说明
$project:指定保留原始顶层字段(EID、EName、ESalary),同时通过字段路径直接引用嵌套字段,完成新顶层字段的定义与重命名。- 数组处理部分:
$filter:从EFevMovieDetails数组中筛选出MoveName等于"Krish"的条目$map:将筛选后的数组元素转换为仅包含MoveName值的数组$arrayElemAt:取出转换后数组的第一个元素,确保仅获取目标值
内容的提问来源于stack exchange,提问作者Radhey Yadav
相关产品推荐
相关产品推荐

