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

MongoDB:如何重命名多层嵌套(对象→数组→对象)中的字段?

解决MongoDB数组嵌套字段重命名问题

问题背景

需要将文档中basicData.devices.relatedJson.equipmentID(大写D)重命名为equipmentId(小写d),同时保持文档其他所有结构和字段不变。原文档结构如下:

{
  "_id":12345,
  "name":"harold",
  "basicData":{
    "devices":[
      {
        "id":7654,
        "relatedJson":{
          "make":"sony",
          "equipmentID":"asdf"
        }
      },
      {
        "id":9493
      }
    ],
    "car":"toyota"
  }
}

原代码的问题在于直接用$$this.relatedJson合并新对象,导致整个device元素被替换成relatedJson的内容,丢失了id等其他字段,逻辑不符合需求。

正确的更新脚本

db.serviceAgreement.updateMany(
  // 匹配条件:仅处理包含目标字段的文档
  {"basicData.devices.relatedJson.equipmentID": {$exists: true}},
  [
    {
      $set: {
        "basicData.devices": {
          $map: {
            input: "$basicData.devices",
            in: {
              $cond: {
                // 判断当前device是否存在relatedJson.equipmentID
                if: {$and: [
                  {$ne: ["$$this.relatedJson", undefined]},
                  {$exists: ["$$this.relatedJson.equipmentID"]}
                ]},
                then: {
                  // 保留原device的所有字段,仅修改relatedJson部分
                  $mergeObjects: [
                    "$$this",
                    {
                      relatedJson: {
                        $mergeObjects: [
                          "$$this.relatedJson",
                          {equipmentId: "$$this.relatedJson.equipmentID"}
                        ],
                        // 删除原equipmentID字段
                        $unset: ["equipmentID"]
                      }
                    }
                  ]
                },
                // 不满足条件的device直接返回原内容
                else: "$$this"
              }
            }
          }
        }
      }
    }
  ]
)

代码解释

  • 匹配条件:精准定位包含relatedJson.equipmentID的文档,避免无意义的遍历。
  • $map遍历数组:逐个处理devices中的每个元素:
    • 条件判断:先检查当前device是否存在relatedJson及equipmentID字段,避免处理无相关数据的元素。
    • $mergeObjects层级合并:
      1. 第一层合并保留原device的所有字段(如id)。
      2. 第二层合并修改relatedJson:保留原relatedJson的其他字段(如make),添加新的equipmentId字段。
      3. 用$unset在relatedJson内部删除旧的equipmentID字段。
    • 默认返回原元素:不满足条件的device直接保持原样,不做任何修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:35:17