2012-05-05 16 views
8

Ich habe Dokument wieaktualisieren eingebettetes Objekt innerhalb Array innerhalb Array in MongoDB

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

Ich kann nicht $set Zauber level : 3 mit spell_id : 1 innen spells, die in heros mit Spitznamen „test ich diese Abfrage versucht.

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

errror i sehen ist

kann nicht an Array mit String Feldname [Spells] Dank für Hilfe anhängen.

Antwort

9

Sie können den Positionsoperator $ nur für Arrays mit einer Ebene verwenden. In Ihrem Fall haben Sie ein verschachteltes Array (heros ist ein Array, und innerhalb dieses Helden hat jeder ein spells Array).

Wenn Sie die Indizes der Arrays kennen, können Sie expliziten Indizes verwenden, wenn ein Update zu tun, wie:

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

Ja, ich habe dich gesagt, sagte –

+0

Danke dcrosta !!! –

1

versuchen, etwas wie folgt aus:

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); 
}); 

Offenbar öffnete jemand ein Ticket die Möglichkeit, fügen Sie eine Funktion innerhalb der Update-Klausel zu setzen, aber es wurde noch nicht angesprochen: https://jira.mongodb.org/browse/SERVER-458

+0

Ihr Code funktioniert nicht. Ich denke in X wird alles Dokument sein, nicht wahr? –

+0

@DenisErmolin oops ... ja, das war falsch. Ich habe noch einmal darauf geschossen (siehe Update). ** x ** ist das Dokument, richtig, also denke ich, dass Sie in der Lage sein sollten, es durch die Eigenschaft ** id ** zu aktualisieren. – McGarnagle

+0

x.spells Verweise auf Zauber, aber Zaubersprüche in Heros Array –

Verwandte Themen