直接使用Mongodb中的嵌入式文档

时间:2011-12-08 16:03:54

标签: mongodb key-value

我正在使用一个复杂的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数组。

有没有办法将修改后的嵌入式文档批量传递给这样的更新语句,有选择地通过文档中的值传递?或者我是以错误的方式思考这个问题,并且我需要编写另一个存储的迭代器函数,它将再次找到该项,然后使用深入嵌入的新值更新整个父文档?谢谢!

2 个答案:

答案 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