You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),同时通过字段路径直接引用嵌套字段,完成新顶层字段的定义与重命名。
  • 数组处理部分:
    1. $filter:从EFevMovieDetails数组中筛选出MoveName等于"Krish"的条目
    2. $map:将筛选后的数组元素转换为仅包含MoveName值的数组
    3. $arrayElemAt:取出转换后数组的第一个元素,确保仅获取目标值

内容的提问来源于stack exchange,提问作者Radhey Yadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:40:57