Как мне обновить поле в массиве поддокумента с полем из документа в MongoDB? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть большой объем данных (~ 160M элементов), где значение даты не было заполнено в полях массива поддокумента, но было заполнено в родительском документе. Я очень новичок в MongoDB и не могу понять, как $ установить поле для соответствия. Вот пример данных:

{
   "_id": "5f11d4c48663f32e940696ed",
   "Widgets":[{
         "WidgetId":663,
         "Name":"Super Widget 2.0",
         "Created":null,
         "LastUpdated":null
      }],
   "Status":3,
   "LastUpdated":null,
   "Created": "2018-11-09T18:22:16.000Z"
   }
}

Мои знания MongoDB довольно ограничены, но вот базовая c агрегация, которую я создал для части конвейера, и с которой я борюсь:

db.sample.aggregate(
    [
        { 
            "$match" : { 
                "Donors.$.Created" : { 
                    "$exists" : true
                }
            }
        }, 
        { 
            "$match" : { 
                "Widgets.$.Created" : null
            }
        }, 
        { 
            "$set" : { 
                "Widgets.$.Created" : "Created"     // <- This is where I can't figure out how to define the reference to the parent "Created" field
            }
        }
    ]
);

Желаемый результат будет:

{
   "_id": "5f11d4c48663f32e940696ed",
   "Widgets":[{
         "WidgetId":663,
         "Name":"Super Widget 2.0",
         "Created":"2018-11-09T18:22:16.000Z",
         "LastUpdated":null
      }],
   "Status":3,
   "LastUpdated":null,
   "Created": "2018-11-09T18:22:16.000Z"
   }
}

Спасибо за любую помощь

1 Ответ

2 голосов
/ 05 августа 2020

Вы пытаетесь добавить поле Created в субдокументы по запросу / агрегированию? Или вы пытаетесь обновить / сохранить поле Created во вложенных документах?

$ - это оператор обновления, который будет использоваться с updateMany или updateOne. Не совокупный. https://docs.mongodb.com/manual/reference/operator/query-array/

https://docs.mongodb.com/manual/reference/operator/update-array/

Если вы просто хотите добавить поле родителей Created во все вложенные документы по запросу / агрегированию, это это все, что вам нужно сделать: https://mongoplayground.net/p/yHDHULCSTIz

db.collection.aggregate([
  {
    "$addFields": {
      "Widgets.Created": "$Created"
    }
  }
])

Если вы пытаетесь сохранить поле родителей Created для всех поддокументов:

db.sample.updateMany({"Widgets.Created" : null}, [{$set: {"Widgets.Created" : "$Created"}}])

Примечание : Соответствует любому do c, у которого есть вложенный документ с пустым полем Created, и обновляет все вложенные документы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...