如何将值更新到 mongodb 文档中的嵌套对象数组?

How to update the value to the nested object array in mongodb document?

我有以下文档需要更新。


    {
        "_id": "Colorcode_1",
        "Combination": [
            {
                "color": [
                    {
                        "mixture": [
                            "Red",
                            "Green"
                        ]
                    }
                ],
                "code": "Maroon"
            },
            {
                "color": [
                    {
                        "mixture": [
                            "Yellow",
                            "Green"
                        ]
                    }
                ],
                "code": "Light Green"
            }
        ]
    }

现在我需要做的是 更新 文档,方法是在“代码”为“栗色”的“混合”字段中添加值“蓝色”。像这样的东西。这需要使用 $addToSet

来完成

    {
        "_id": "Colorcode_1",
        "Combination": [
            {
                "color": [
                    {
                        "mixture": [
                            "Red",
                            "Green",
                            "Blue"
                        ]
                    }
                ],
                "code": "Maroon"
            },
            {
                "color": [
                    {
                        "mixture": [
                            "Yellow",
                            "Green"
                        ]
                    }
                ],
                "code": "Light Green"
            }
        ]
    }

有关此的任何帮助都将非常有帮助。

由于数据模型的原因,我发现此更新很困难,希望您能得到 better/simpler 答复。

无论如何,这是您可以做到的一种方法。我会在 more/different 数据上测试它以确保它是正确的。

db.collection.update({
  "_id": "Colorcode_1",
  "Combination.code": "Maroon"
},
[
  {
    "$set": {
      "Combination": {
        "$map": {
          "input": "$Combination",
          "as": "elem",
          "in": {
            "$cond": [
              { "$eq": [ "$$elem.code", "Maroon" ] },
              {
                "$mergeObjects": [
                  "$$elem",
                  {
                    "color": {
                      "$map": {
                        "input": "$$elem.color",
                        "as": "colorElem",
                        "in": {
                          "$cond": [
                            {
                              "$reduce": {
                                "input": { "$objectToArray": "$$colorElem" },
                                "initialValue": false,
                                "in": {
                                  "$or": [
                                    "$$value",
                                    { "$eq": [ "$$this.k", "mixture" ] }
                                  ]
                                }
                              }
                            },
                            {
                              "mixture": {
                                "$setUnion": [ "$$colorElem.mixture", [ "Blue" ] ]
                              }
                            },
                            "$$colorElem"
                          ]
                        }
                      }
                    }
                  }
                ]
              },
              "$$elem"
            ]
          }
        }
      }
    }
  }
])

mongoplayground.net 上试用。

这是带有 arrayFilters 的选项:

db.collection.update({
   "Combination.code": "Maroon"
  },
  {
   "$addToSet": {
    "Combination.$[x].color.$[y].mixture": "Blue"
   }
 },
 {
  arrayFilters: [
  {
    "x.code": "Maroon"
  },
  {
   "y.mixture": {
    $exists: true
  }
}
 ]
})

解释:

  1. 过滤所有具有 code:Marron 的文档,如果集合很大
  2. ,最好在该字段上有索引
  3. 如果混合物存在(由 y arrayFilter 标识),则使用 arrayFilter x.code 将数组元素添加到混合物中

playground