我正在使用一个复杂的mongodoc,它有几个嵌入式文档,代表清单中的项目。整个文档可以被认为是一个完整的库存。关键字“部分”包含另一个关键“项目”,其中包含单个项目及其数据,如价格,描述等。每个项目还有一个GUID,因此可以单独查找。
我编写了一个存储函数,用于按ID搜索单个项目,如下所示:
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];
}
}
}
}
到目前为止,一切都有效。问题是我想要修改此嵌入式文档并将其保存回其父文档中。 shell给出的例子:
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}})
但是这不能正常工作并尝试附加到items数组。
有没有办法将修改后的嵌入式文档批量传递给这样的更新语句,有选择地通过文档中的值传递?或者我是以错误的方式思考这个问题,并且我需要编写另一个存储的迭代器函数,它将再次找到该项,然后使用深入嵌入的新值更新整个父文档?谢谢!
答案 0 :(得分:1)
如果你想修改数组中的项目,我建议先使用条件$ pull和$ push更新项目。
在你的情况下,由于你有section数组,它会有点复杂。因此,您可能需要在其上使用$运算符,然后$ pull / $ push on items array。
答案 1 :(得分:0)
如果我理解正确,您的意图是在特定位置访问和修改数组中的值。如果是这种情况,您可以稍微修改您的查询:
db.pricelists.update(
{'sections.item.item_id': 1},
{$set: {'sections.item.item_id.$': item}}
)
换句话说,你不需要使用[1],$指的是在.update()方法的第一个参数中指定的第一个匹配。有关详细信息,请参阅位置运算符:http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator