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
}
]
}]
Как я могу вставить внутри поддоку комментариев?
Ответы
Ответ 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
Чтобы обойти эту проблему с массивами, вам просто нужно сделать обычную находку, а затем обновить элементы в массиве индивидуально.