2012-05-05 5 views
8

Je document comme celuiMise à jour objet incorporé à l'intérieur tableau à l'intérieur tableau dans MongoDB

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

Je ne peux pas $set sort de level : 3 avec spell_id : 1 à l'intérieur spells qu'à l'intérieur heros avec le surnom « test j'ai essayé cette requête.

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

errror que je vois est

ne peut pas ajouter à tableau en utilisant le nom de champ de chaîne [Sorts] Merci pour l'aide.

Répondre

9

Vous ne pouvez utiliser que l'opérateur de position $ pour les baies à un niveau. Dans votre cas, vous avez un tableau imbriqué (heros est un tableau, et dans lequel chaque héros a un tableau spells).

Si vous connaissez les index des tableaux, vous pouvez utiliser les index explicites lorsque vous effectuez une mise à jour, comme:

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

Ouais je l'ai fait comme vous l'avez dit –

+0

Merci dcrosta !!! –

1

Essayez quelque chose comme ceci:

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

Apparemment, quelqu'un a ouvert un ticket pour ajouter la possibilité de mettre une fonction dans la clause de mise à jour, mais il n'a pas été abordée encore: https://jira.mongodb.org/browse/SERVER-458

+0

Votre code ne fonctionne pas. Je pense que x sera tout le document n'est-ce pas? –

+0

@DenisErmolin oups ... ouais, c'était faux. J'ai pris une autre photo (voir mise à jour). ** x ** est le document, et je pense que vous devriez pouvoir le mettre à jour avec la propriété ** id **. – McGarnagle

+0

x.spells référence aux sorts mais sorts dans le tableau heros –

Questions connexes