将属性添加到mongodb文档中的嵌套数组

时间:2011-07-19 22:05:31

标签: javascript mongodb mongo-shell

我有一个具有以下结构的mongodb文档

> db.user.find().limit(1);
{ "_id" : "1", "foo" : { "bars" : [
    {
        "name" : "bar1"
    },
    {
        "name" : "bar2"
    },
], ... }, ... }

我想为每个bar添加一个新属性。我的脚本在bars数组上进行迭代,但我无法在那里获取新属性,我该怎么做?

var users = db.user.find({"foo.bars":{$exists:true}});

users.forEach(function(user) {
    user.foo.bars.forEach(function(bar)
    {
       printjson(bar);
       //how can I specify the current 'bar' in this update?
       //db.experience.update({_id: user._id}, {$set: {"what goes here?" : "newbarValue"}});
    });
});

3 个答案:

答案 0 :(得分:10)

传道人说:

var users = db.user.find({"foo.bars":{$exists:true}});

users.forEach(function(user) {
    var id = user._id;

    var foo_bars = user.foo.bars;
    var new_foo_bars = [];

    for(var i = 0; i < foo_bars.length; i++) {
        var foo_bar = foo_bars[i];
        foo_bar['newkey'] = 'newvalue';
        new_foo_bars.push(foo_bar);
    }

    db.user.update({"_id":id}, {$set:{"foo.bars":new_foo_bars}});
});

答案 1 :(得分:1)

我注意到你在JS中滚动浏览客户端的数组。

如果你要成立一个新的&#34;酒吧&#34;来自旧数组的数组然后将其作为一个全新的值推入,这意味着你只需要进行一次数据库调用,而且代码非常优雅。

如果MongoDB通常不支持它,那么最好只在客户端进行工作。

答案 2 :(得分:0)

您必须单独更新嵌套文档的每个元素。使用位置运算符'$'将不起作用,因为它仅适用于第一个匹配(如文档所述)。