MongoDB: обновление от ObjectId до строки для многих документов - PullRequest
0 голосов
/ 06 февраля 2020

У меня сложная структура, похожая на:

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

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

Для такого рода структуры данных я хочу обновить тип данных для всех этих importantKeys из ObjectId в строку.

I пробовал запросы, похожие на:

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] элементы означают объекты со списком элементов.

1 Ответ

0 голосов
/ 06 февраля 2020

Вы можете использовать этот обходной путь:

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

...