2012-05-05 20 views
8

Mam dokument jakAktualizacja obiekt osadzony wewnątrz tablicy wewnątrz tablicy w MongoDB

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

nie mogę $set czaru level : 3 z spell_id : 1 wewnątrz spells że wewnątrz heros z pseudonimu „test Próbowałem tej kwerendy.

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

errror widzę jest

nie można dodać do tablicy używając nazwy pola tekstowego [spells] Dzięki za pomoc.

Odpowiedz

9

Operatora pozycyjnegomożna używać tylko do tablic jednopoziomowych. W twoim przypadku masz tablicę zagnieżdżoną (heros to tablica, w której każdy bohater ma tablicę spells).

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

Tak, podobało mi się, że powiedziałeś –

+0

Dzięki dcrosta !!! –

1

spróbować czegoś takiego:

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

Najwyraźniej ktoś otworzył bilet, aby dodać możliwość umieszczenia funkcji wewnątrz klauzuli aktualizacji, ale nie została jeszcze skierowana: https://jira.mongodb.org/browse/SERVER-458

+0

Twój kod nie działa:

Jeśli znasz indeksy tablic można robiąc aktualizację, jak korzystać z jawnych indeksów. Myślę, że w x będzie cały dokument, prawda? –

+0

@DenisErmolin oops ... tak, to było złe. Zrobiłem kolejny strzał (patrz aktualizacja). ** x ** to dokument, prawda, więc myślę, że powinieneś być w stanie zaktualizować go przez właściwość ** id **. – McGarnagle

+0

x. Odsyłacze do czarów, ale czary w tablicy herosów –

Powiązane problemy