Вопрос по mongodb, mongodb-query – Обновить встроенный объект внутри массива внутри массива в MongoDB

9

У меня есть документ как

<code>{
    id : 100,
    heros:[
        {
           nickname : "test",
           spells : [
             {spell_id : 61, level : 1},
             {spell_id : 1, level : 2}
           ]
        }
    ]
}
</code>

Я не могу$set по буквам & APOS; slevel : 3 сspell_id : 1 внутриspells что внутриheros с ником & quot; тест. Я пробовал этот запрос:

<code>db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, 
{$set:{"heros.spells.$.level":3}});
</code>

Ошибка, которую я вижу,

can't append to array using string field name [spells] Thanks for help.

Ваш Ответ

2   ответа
1

db.test.find({"heros.nickname":"test"}).forEach(function(x) {  
    bool match = false;
    for (i=0 ; i< x.heros[0].spells.length ; i++) {
        if (x.heros[0].spells[i].spell_id == 1) 
        {
            x.heros[0].spells[i].level = 3;
            match = true;
        }
    }
    if (match === true) db.test.update( { id: x.id }, x );
});

Очевидно, кто-то открыл заявку, чтобы добавить возможность поместить функцию в предложение обновления, но она еще не была рассмотрена:https://jira.mongodb.org/browse/SERVER-458

x.spells ссылка на заклинания, но заклинания в массиве героев Denis Ermolin
Ваш код не работает. Я думаю, что в x будет весь документ, не так ли? Denis Ermolin
@DenisErmolin ой ... да, это было неправильно. Я сделал еще один снимок (см. Обновление).x документ, так что я думаю, что вы сможете обновить его поid имущество.
Это должно работать, но не влияет на этот кусок, если код. знак равно Denis Ermolin
@ DenisErmolin Вы правы, извините. Обновлено еще раз.
11

$ позиционный оператор для одноуровневых массивов. В вашем случае у вас есть вложенный массив (heros массив, и внутри каждого героя естьspells массив).

Если вы знаете индексы массивов, вы можете использовать явные индексы при выполнении обновления, например:

> db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, {$set:{"heros.0.spells.1.level":3}});
Спасибо dcrosta !!!
Да, я сделал, как ты сказал Denis Ermolin

Похожие вопросы