Я работаю со сложным mongodoc, в котором есть несколько встроенных документов, представляющих предметы в инвентаре. Весь документ можно рассматривать как полный инвентарь. Ключ «разделы» содержит еще один ключ «элементы», который содержит отдельные элементы и их данные, такие как цена, описание и т. Д. Каждый элемент также имеет GUID, поэтому его можно искать по отдельности.
Я написал хранимую функцию для поиска отдельных предметов по идентификатору, которая выглядит следующим образом:
function (item_id) {
var pls = db.pricelists.findOne({'sections.items.item_id':item_id});
if (!pls) {
return null;
}
for (var sect in pls.sections) {
for (var item in pls.sections[sect].items) {
if (pls.sections[sect].items[item].item_id == item_id) {
return pls.sections[sect].items[item];
}
}
}
}
Пока все работает, найди. Проблема в том, что я хочу изменить этот встроенный документ и сохранить его обратно в родительском документе. Примеры, приведенные в оболочке:
var item = db.eval('find_item(1)');
item.users_who_bought = [11,16];
item;
Это выводит обратно на консоль правильный пункт.
{
"name" : "item00",
"order" : 0,
"item_id" : 1,
"hidden" : false,
"variants" : [
{
"price" : "0.56",
"label" : "variant000"
},
{
"price" : "1.56",
"label" : "variant001"
},
{
"price" : "2.56",
"label" : "variant002"
}
],
"desc" : "Sociis habitasse, integer pellentesque sit! Nisi purus tincidunt amet mus scelerisque amet, pid enim eros phasellus dolor sociis nunc dictumst sed nunc, integer hac!",
"users_who_bought" : [11,16]
}
Я в недоумении по поводу того, как сформулировать запрос для обновления этого документа встроенного элемента обратно в его родительский документ. Я пробовал что-то вроде этого (например, item_id здесь жестко закодирован как один):
db.pricelists.update({'sections.item.item_id': 1}, {$set: {'sections.item.item_id[1]': item}})
Но это не работает правильно и пытается добавить к массиву элементов.
Существует ли способ оптовой передачи измененного встроенного документа в оператор обновления, подобный этому, выборочно по значению в документе? Или я думаю об этом неправильно, и мне нужно написать еще одну сохраненную функцию итератора, которая снова найдет элемент, а затем обновит весь родительский документ новыми глубоко внедренными значениями? Спасибо!