добавить свойство во вложенный массив в документе mongodb - PullRequest
5 голосов
/ 20 июля 2011

У меня есть документ 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 ]

10 голосов
/ 20 июля 2011

Так говорит проповедник человек:

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 голос
/ 20 июля 2011

Я заметил, что вы прокручиваете массив на стороне клиента в JS.

Если вы хотите сформировать новый массив "bars" из старого, то вставьте его как новыйзначение означает, что вы делаете только один вызов БД, и код довольно элегантный.

Если MongoDB обычно не поддерживает его, лучше просто выполнить работу на стороне клиента.

0 голосов
/ 20 июля 2011

Необходимо обновить каждый элемент вложенного документа в отдельности. Использование позиционного оператора '$' не будет работать, так как он будет работать только при первом совпадении (как задокументировано).

...