2012-05-06 14 views
13

Wczoraj mam kłopoty z mongodb i node.js i mam problemy z przejrzeniem dokumentacji mongody dotyczącej aktualizacji zagnieżdżonych obiektów/dokumentów.Zwiększanie wartości w obiekcie zagnieżdżonym?

Mam kolekcji, w których dokumenty wyglądają tak ..

{ 
gameName: "string", 
slug: "string", 
players: [{playerName, playerScore}, ...] 
} 

Próbuję dowiedzieć się, jak zwiększyć wartość playerScore oparciu o playerName.

Przypuszczam, że to głównie sprowadza się do mnie niezrozumienie metody NoSQL. Mam nawet wątpliwości co do korzystania z tablicy dla graczy, więc wszelkie dane wejściowe będą mile widziane.

Dzięki!

+1

Twoja składnia jest nieprawidłowa –

Odpowiedz

18

Struktura chcesz to:

{ 
gameName: "string", 
slug: "string", 
players: [ { playerName: "string", playerScore: number} ] , ...] 
} 

Aby zwiększyć ocenę gracza o jeden, jeśli ma na imię Joe, należy użyć:

db.collection.update({"players.playerName":"Joe"}, { $inc : { "players.$.playerScore" : 1 } } 
+0

Jestem zdezorientowany przez strukturę plakatu. Co oznacza {playerName, playerScore}? –

+0

Widzę zamieszanie - zakładałem, że gracze byli zbiorem dokumentów, w których każdy dokument zawierał {playerName: "string", playerScore: "number"}, ale oczywiście to nie jest to, co napisał. Będziemy musieli poczekać, aż on wróci i wyjaśni, domyślam się ... –

+0

Tak - przepraszam, myślałem, że struktura była na tyle ukryta, aby pominąć określenie typu danych dla zagnieżdżonego obiektu. Udało mi się uzyskać to, co określiłeś, aby pracować z jedną grą, jednak nie wydawało się to działać tak dobrze, jeśli spróbuję wyszukać konkretną grę. Położyłem to na tylnym palniku, podczas gdy ja wykonuję jakąś prawdziwą pracę do końca przemyślaną :) – JackM

4

Uważam, że trzeba by struktura dokumentu zamiast jak

 
{ 
gameName: "string", 
slug: "string", 
players: {playerName: {score: playerScore}}, 
} 

Następnie można zaktualizować wynik z:

 
db.games.update({"gameName": "string"}, 
       {$inc: {"players.playerName.score": 1} 
       }) 
+0

jak ten dokument będzie obsługiwał wielu graczy? Co było nie tak z oryginalną strukturą dokumentu pytania? Wygląda na to, że chce reprezentować wielu graczy w grze. Proponujesz jeden dokument na gracza, na mecz? Skąd będziesz wiedzieć, aby zaktualizować poprawny, w aktualizacji nie ma selektora innego niż gameName ... –

+0

playerName to tylko symbol zastępczy tutaj. Może to być {$ inc: {"players.bobby.score": 1}} –

+0

nie wygląda to jak poprawny dokument, chyba że naprawdę planujesz mieć inne pole _name_ do reprezentowania każdego gracza. Jako wyjaśnienie, w jaki sposób otrzymasz listę nazw graczy dla danej gry z tej struktury dokumentu? –

Powiązane problemy