Как добавить дополнительное поле в поддокумент в MongoDB?

Я только начал работать с MongoDB. И у меня есть такой документ:

   {

     "_id": "12345" 
     "body": "Here is the body" 
     "comments":[
                {
                  "name": "Person 1"
                  "comm": "My comment"},
                {
                  "name": "Person 2"
                  "comm": "Comment 2"}
             ] 
    "author":"Author 1" 
}

И я хочу изменить этот документ на:

   {

    "_id": "12345" 
     "body": "Here is the body" 
     "comments":[
                {
                  "name": "Person 1"
                  "comm": "My comment"
                  "checks_": 1
                 },
                {
                  "name": "Person 2"
                  "comm": "Comment 2"
                  "checks_": 4
                }
             ] 
    "author": "Author 1" 
}

Я пытался:

db.coll.update({ "_id":12345},{ "$set":{ "comments" :{ "checks_": 1}}})

И это удалило все поддокументы в комментариях и добавило к ним {checks_:1}.

Где я ошибаюсь?


person Saturnian    schedule 23.03.2014    source источник
comment
возможный дубликат как обновить несколько элементов массива в mongodb   -  person joao    schedule 23.03.2014
comment
Не удалось найти решение, которое помогло бы мне ..   -  person Saturnian    schedule 23.03.2014
comment
Если вы хотите обновить один вложенный документ массива, вы можете сделать db.coll.update({id:12345},{$set:{comments.0.checks:1}}). Это обновит документ с индексом массива 0.   -  person joao    schedule 23.03.2014
comment
А, спасибо, сработало!   -  person Saturnian    schedule 23.03.2014
comment
Что делать, если мне нужно сделать во всем подмассиве за один раз?   -  person Dhruv Kaushal    schedule 05.08.2019


Ответы (2)


Итак, что вы делаете неправильно, так это то, что оператор $set делает именно то, что должно, и заменяет только поле comments указанным вами значением. Это не добавляет дополнительный документ в массив.

Вам нужно быть конкретным и использовать "точечную нотацию" для "обозначения", какой элемент массива вы заменяете. Итак, чтобы получить результат, вам нужны два обновления:

db.coll.update({ "_id":12345},{ "$set":{ "comments.0.checks_" : 1 }})
db.coll.update({ "_id":12345},{ "$set":{ "comments.1.checks_" : 4 }})

Это по крайней мере до тех пор, пока не будет выпущена следующая версия (на момент написания) MongoDB, где вы можете сделать массовые обновления. И это не будет теперь долго.

person Neil Lunn    schedule 23.03.2014

Немного более универсальное решение (для MongoDb 3.6+):

db.coll.update(
{},
{$set: {"comments.$[element].checks_": 1}},
{multi: false, arrayFilters: [{"element.name": {$eq: "Person 1"}}]}
)

Это добавит поле в конкретный поддокумент из списка, соответствующий критериям (имя = «Лицо 1»).

person Dimitar II    schedule 28.09.2018