Хорошо, поскольку в массиве A
есть только один объект, который вы можете просто сделать, как показано ниже:
Образцы данных для сбора:
{
"_id" : ObjectId("5e7c3cadc16b5679b4aeec26"),
A:[
{
B: [{ abc: 1 }]
}
]
}
Запрос:
/** Insert new fields into 'A' array's first object by index 0 */
db.collection.updateOne(
{ "_id" : ObjectId("5e7c3f77c16b5679b4af4caf") },
{ $set: { "A.0.x": [] , "A.0.y" : {abcInY :1 }} }
)
Вывод:
{
"_id" : ObjectId("5e7c3cadc16b5679b4aeec26"),
"A" : [
{
"B" : [
{
"abc" : 1
}
],
"x" : [],
"y" : {
"abcInY" : 1.0
}
}
]
}
Или с использованием позиционного оператора $ :
db.collection.updateOne(
{ _id: ObjectId("5e7c3cadc16b5679b4aeec26") , 'A': {$exists : true}},
{ $set: { "A.$.x": [] , "A.$.y" : {abcInY :1 }} }
)
Примечание: Результат будет таким же, но функционально при использовании позиционного оператора поля x
& y
вставляются в первый объект массива A
только тогда, когда в этом поле существует поле A
документы, если бы не этот позиционный запрос не вставил бы ничего (опционально вы можете проверить, что A
также является условием массива, если это необходимо). Но когда вы выполняете обновления с использованием индекса 0
, как в первом запросе, если A
не существует в документе, тогда обновление создаст поле A
, которое является объектом, и вставит в него поля (что может привести к несогласованности данных во всех документы с двумя типами поля A
) - проверьте приведенный ниже результат первого запроса, когда A
не существует.
{
"_id" : ObjectId("5e7c3f77c16b5679b4af4caf"),
"noA" : 1,
"A" : {
"0" : {
"x" : [],
"y" : {
"abcInY" : 1.0
}
}
}
}