如何将嵌入文档数组中的值带入MongoDB的根中?

6yoyoihd  于 2023-11-17  发布在  Go
关注(0)|答案(2)|浏览(164)

我有以下记录:

id: 119,
customfields: Array (2)

  0: Object
    value: "Mr"
    type: "salutation"

  1: Object
    value: "Google"
    type: "company"

字符串
我需要更新此文档,以便获得:

id: 119,
salutation: "Mr",
company: "Google"

重要的是

  • 参数的位置可以变化,即,一些记录首先有salutation,其他记录有company,其他记录可能有其他无关紧要的字段。
  • 有些文档在customfields数组中没有salutation记录,因此应该忽略。公司的逻辑相同。
e5nqia27

e5nqia271#

$mapcustomfields先到一个k-v元组数组。然后,$mergeObjects$$ROOT对象得到最终对象。$unset现在没用的自定义字段和$mergeid更新回文档。

db.collection.aggregate([
  {
    "$match": {
      "id": 119
    }
  },
  {
    "$set": {
      "customfields": {
        "$arrayToObject": {
          "$map": {
            "input": "$customfields",
            "as": "cf",
            "in": {
              "k": "$$cf.type",
              "v": "$$cf.value"
            }
          }
        }
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          "$$ROOT",
          "$customfields"
        ]
      }
    }
  },
  {
    "$unset": "customfields"
  },
  {
    "$merge": {
      "into": "collection",
      "on": "id"
    }
  }
])

字符串
Mongo Playground

vmjh9lq9

vmjh9lq92#

下面是另一种使用"$reduce"重建文档的方法。

db.collection.update({
  "id": 119
},
[
  {
    "$set": {
      "newRoot": {
        "$reduce": {
          "input": "$customfields",
          "initialValue": {
            "id": "$id"
          },
          "in": {
            "$mergeObjects": [
              "$$value",
              {
                "$arrayToObject": [
                  [
                    {
                      "k": "$$this.type",
                      "v": "$$this.value"
                    }
                  ]
                ]
              }
            ]
          }
        }
      }
    }
  },
  {"$replaceWith": "$newRoot"}
])

字符串
mongoplayground.net上试试。

相关问题