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

How do I update a specific property of a nested array element in MongoDB

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

{
  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 a similar problem on SO 之后我做了以下事情:

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

但这不起作用,因为 $ 指的是当前文档,而不是嵌套的数组元素。我怎样才能实现我上面描述的目标?

您似乎正在使用带有聚合管道的更新,您需要 $map 运算符。

对于 $arrayElementAt 部分,我认为您需要 1 作为索引来获取第二个元素。

假设要更新的过滤器returns个文档:

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