Подтвердить что ты не робот

MongoDB: обновление поддокумента

У меня есть эта коллекция:

[{ "_id" : 7,
   "category" : "Festival",
   "comments" : [
        {
                "_id" : ObjectId("4da4e7d1590295d4eb81c0c7"),
                "usr" : "Mila",
                "txt" : "This is a comment",
                "date" : "4/12/11"
        }
    ]
}]

Все, что я хочу, это нажать вставить новое поле внутри комментариев следующим образом:

[{ "_id" : 7,
   "category" : "Festival",
   "comments" : [
        {
                "_id" : ObjectId("4da4e7d1590295d4eb81c0c7"),
                "usr" : "Mila",
                "txt" : "This is a comment",
                "date" : "4/12/11",
                "type": "abc"  // find the parent doc with id=7 & insert this inside comments
        }
    ]
}]

Как я могу вставить внутри поддоку комментариев?

4b9b3361

Ответ 1

Вам нужно использовать оператор $positional

Например:

update({ 
       _id: 7, 
       "comments._id": ObjectId("4da4e7d1590295d4eb81c0c7")
   },{
       $set: {"comments.$.type": abc}
   }, false, true
);

Я не тестировал его, но надеюсь, что это будет полезно для вас.

Если вы хотите изменить структуру документа, вам нужно использовать

db.collection.update(критерии, objNew, upsert, multi)

Аргументы:

criteria - query which selects the record to update;
objNew - updated object or $ operators (e.g., $inc) which manipulate the object
upsert - if this should be an "upsert"; that is, if the record does not exist, nsert it
multi - if all documents matching criteria should be updated

и вставьте новый объект objNew с новой структурой. проверьте это для более подробной информации

Ответ 2

Оператор $positional будет работать, как и ожидалось, если поле "comments" НЕ является массивом. OP json неверен, но похоже, что это может быть массив.

Проблема в том, что mongodb прямо сейчас обновит только первый элемент массива, который соответствует запросу. Хотя есть RFE, чтобы добавить поддержку для обновления всех соответствующих элементов массива: https://jira.mongodb.org/browse/SERVER-1243

Чтобы обойти эту проблему с массивами, вам просто нужно сделать обычную находку, а затем обновить элементы в массиве индивидуально.