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呼び出しを1回だけ実行することを意味し、コードは非常に洗練されています。

MongoDBが通常それをサポートしていない場合は、クライアント側で作業を行う方がよいでしょう。

于 2011-07-20T12:39:00.510 に答える
0

ネストされたドキュメントの各要素を個別に更新する必要があります。位置演算子 '$' の使用は、(文書化されているように) 最初の一致でのみ機能するため、機能しません。

于 2011-07-20T04:36:36.310 に答える