MongoDB-如何从非结构化数组字段列表中重命名特定字段?

发布于 2025-02-11 13:50:03 字数 939 浏览 0 评论 0原文

我有几个文件,如下所示。现在,我需要重命名 middlename 字段中mid_name如果 middlename 存在文档中。

{
    "id":"abc",
    "name":[
      {
          "first_name":"abc",
          "last_name":"def"
      },
      {
          "first_name":"ghi",
          "last_name":"mno",
          "middilename":"xyz"
      }
    ]
}

这是我希望的。

{
    "id":"abc",
    "name":[
      {
          "first_name":"abc",
          "last_name":"def"
      },
      {
          "first_name":"ghi",
          "last_name":"mno",
          "mid_name":"xyz"
      }
    ]
}

这就是我所做的,但会引发错误。

db.md_carrierInformation.updateMany({"name.middlename":{$exists:true}}, {$rename:{"name.$.middlename":"name.mid_name"}})

错误

mongoservererror:$重命名的源字段可能不动态:name。$。middlename

I have several documents as given below. Now I need to do rename the middlename field into mid_name if middlename exists in the document.

{
    "id":"abc",
    "name":[
      {
          "first_name":"abc",
          "last_name":"def"
      },
      {
          "first_name":"ghi",
          "last_name":"mno",
          "middilename":"xyz"
      }
    ]
}

This is something that I expect it to be.

{
    "id":"abc",
    "name":[
      {
          "first_name":"abc",
          "last_name":"def"
      },
      {
          "first_name":"ghi",
          "last_name":"mno",
          "mid_name":"xyz"
      }
    ]
}

And this is what I have done but it throws the error.

db.md_carrierInformation.updateMany({"name.middlename":{$exists:true}}, {$rename:{"name.$.middlename":"name.mid_name"}})

ERROR

MongoServerError: The source field for $rename may not be dynamic: name.$.middlename

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

始终不够 2025-02-18 13:50:03

使用聚合管道进行更新。

  1. $ set - set <代码>名称数组字段。

    1.1。 $ MAP - 迭代名称>名称>数组中的每个项目并返回新数组。

    1.2。 $ cond - 检查当前文档的middlename的条件。

    1.2.1。如果true,则将当前文档与字段mid_name通过$ mergeObjects

    1.2.2。如果false,请保留现有文档。

  2. $ unset - 删除name.middlename的字段。

db.md_carrierInformation.updateMany({
  "name.middlename": {
    $exists: true
  }
},
[
  {
    $set: {
      "name": {
        $map: {
          input: "$name",
          in: {
            $cond: {
              if: {
                $ne: [
                  "$this.middlename",
                  undefined
                ]
              },
              then: {
                $mergeObjects: [
                  "$this",
                  {
                    mid_name: "$this.middlename"
                  }
                ]
              },
              else: "$this"
            }
          }
        }
      }
    }
  },
  {
    $unset: "name.middlename"
  }
])

示例mongo playground

Work on the update with the aggregation pipeline.

  1. $set - Set name array field.

    1.1. $map - Iterate each item in name array and return new array.

    1.2. $cond - Condition for checking current document's middlename is not existed.

    1.2.1. If true, with merge current document with the document with field mid_name via $mergeObjects.

    1.2.2. If false, remain the existing document.

  2. $unset - Remove field for name.middlename.

db.md_carrierInformation.updateMany({
  "name.middlename": {
    $exists: true
  }
},
[
  {
    $set: {
      "name": {
        $map: {
          input: "$name",
          in: {
            $cond: {
              if: {
                $ne: [
                  "$this.middlename",
                  undefined
                ]
              },
              then: {
                $mergeObjects: [
                  "$this",
                  {
                    mid_name: "$this.middlename"
                  }
                ]
              },
              else: "$this"
            }
          }
        }
      }
    }
  },
  {
    $unset: "name.middlename"
  }
])

Sample Mongo Playground

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文