MongoDB:将许多文档的 ObjectId 更新为字符串

MongoDB: update from ObjectId to string for many documents

我的结构很复杂,类似于:

{
    type: "Data",
    data: [
      "item1": {...},
      "item2": {...},
      ...
      "itemN": {
          "otherStructure": {
              "testData": [
                  {
                      "values": {...}
                  },

                  {
                      "values": {
                          "importantKey": ObjectId("23a2345gf651")
                      }
                  }
              ]
          }
      }
    ]
}

对于这种数据结构,我想将所有这些 importantKeys 的数据类型从 ObjectId 更新为字符串。

我正在尝试类似于以下内容的查询:

db.collection.updateMany(
{type:"Data"},
{$toString: "data.$[element].otherStructure.testData.$[element].values.importantKey"},
{"data.element.otherStructure.testData.element.values.importantKey": {$type: "objectId"}})

但是所有这些尝试都没有成功。

那么,是否有适当的解决方案来更新此类数据?

更新 抱歉混淆,我的结构比较复杂:

data.content.$[element].otherStructure.testData.keys.$[element].values.$[element].meta.importantKey

所有这些 $[element] 元素表示具有元素列表的对象。

您可以使用此解决方法:

db.collection.aggregate([
  {
    $addFields: {
      "data.content": {
        $map: {
          input: "$data.content",
          as: "data",
          in: {
            otherStructure: {
              testData: {
                keys: {
                  $map: {
                    input: "$$data.otherStructure.testData.keys",
                    as: "testData",
                    in: {
                      "values": {
                        $map: {
                          input: "$$testData.values",
                          as: "values",
                          in: {
                            "meta": {
                              "importantObject": {
                                "importantKey": {
                                  $toString: "$$values.meta.importantObject.importantKey"
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
{$out:"collection"}
])

MongoPlayground