2012-05-05 13 views
8

Ho documento comeAggiornamento oggetto incorporato all'interno dell'array all'interno matrice in MongoDB

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

non posso $set incantesimo di level : 3 con spell_id : 1 all'interno spells che dentro heros con soprannome di "test ho provato questa query:.

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

errror che vedo è

non può essere aggiunto all'array usando il nome del campo stringa [spells] Grazie per l'aiuto.

risposta

9

È possibile utilizzare solo l'operatore posizionale $ per gli array a livello singolo. Nel tuo caso, hai un array annidato (heros è un array, e all'interno di questo ogni eroe ha un array spells).

Se conoscete gli indici degli array, è possibile utilizzare gli indici espliciti quando si fa un aggiornamento, come:

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

Sì, come mi hai detto, –

+0

Grazie dcrosta !!! –

1

provare qualcosa di simile:

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

A quanto pare qualcuno ha aperto un biglietto per aggiungere la possibilità di mettere una funzione all'interno della clausola di aggiornamento, ma non è stato ancora affrontato: https://jira.mongodb.org/browse/SERVER-458

+0

Il codice non funziona. Penso che x sia tutto un documento vero? –

+0

@DenisErmolin oops ... sì, era sbagliato. Ho fatto un altro tentativo (vedi aggiornamento). ** x ** è il documento, giusto, quindi penso che dovresti essere in grado di aggiornarlo con la proprietà ** id **. – McGarnagle

+0

x.spells riferimento agli incantesimi ma agli incantesimi nell'array di heros –

Problemi correlati