9

私は次のようなドキュメントを持っています

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

ニックネーム「test」でその中を$set綴ることはできません。私はこのクエリを試しました:level : 3spell_id : 1spellsheros

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

私が見るエラーは

文字列フィールド名を使用して配列に追加できません[spells]助けてくれてありがとう。

4

2 に答える 2

12

$位置演算子は、単一レベルの配列にのみ使用できます。あなたの場合、ネストされた配列があります(herosは配列であり、その中に各ヒーローはspells配列を持っています)。

配列のインデックスがわかっている場合は、更新を行うときに次のように明示的なインデックスを使用できます。

> db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, {$set:{"heros.0.spells.1.level":3}});
于 2012-05-07T16:08:08.540 に答える
3

次のようなものを試してください。

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

于 2012-05-05T20:58:52.433 に答える