MongoDB -如何更新嵌套数组元素的特定属性

hpcdzsge  于 2022-11-03  发布在  Go
关注(0)|答案(1)|浏览(186)

我有一个具有以下结构的集合:

{
  arrangements: [
    { displayName: "MRT.8" },
    { displayName: "MRT.10" },
    { displayName: "MRT.12" },
    (...)
  ]
}

我希望将子字符串MRT替换为MOBILE,因此结果如下:

{
  arrangements: [
    { displayName: "MOBILE.8" },
    { displayName: "MOBILE.10" },
    { displayName: "MOBILE.12" },
    (...)
  ]
}

the solution for a similar problem on SO之后,我执行了以下操作:

db.collection('releaseDocument').updateMany({"arrangements.displayName": {$regex: /MRT\..*/}}, [
      {
        $set: {
          'arrangements.displayName': {
            $concat: [
              "MOBILE.",
              {$arrayElemAt: [{$split: ["$displayName", "MRT."]}, 0]}
            ]
          }
        }
      }
    ])

但是这并不起作用,因为$引用的是当前文档,而不是嵌套的数组元素。

xdnvmnnf

xdnvmnnf1#

您似乎正在使用带有聚合管道的更新,需要$map运算符。
对于$arrayElementAt部分,我认为您需要1作为索引来获取第二个元素。
假设筛选器返回要更新的文档:

db.collection.update({
  "arrangements.displayName": {
    $regex: /MRT\..*/
  }
},
[
  {
    $set: {
      "arrangements": {
        $map: {
          input: "$arrangements",
          in: {
            $mergeObjects: [
              "$$this",
              {
                displayName: {
                  $concat: [
                    "MOBILE.",
                    {
                      $arrayElemAt: [
                        {
                          $split: [
                            "$$this.displayName",
                            "MRT."
                          ]
                        },
                        1
                      ]
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    }
  }
])

Sample Mongo Playground

相关问题