5

我有一个具有以下结构的 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"}});
    });
});
4

3 回答 3

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}});
});
于 2011-07-20T15:09:03.563 回答
1

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

如果您要从旧数组中形成一个新的“bars”数组,然后将其作为一个全新的值推入,这意味着您只进行一次 DB 调用,并且代码非常优雅。

如果 MongoDB 通常不支持它,最好只在客户端完成工作。

于 2011-07-20T12:39:00.510 回答
0

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

于 2011-07-20T04:36:36.310 回答