2012-05-06 17 views
13

Sto scherzando con mongodb e node.js questo fine settimana e sto avendo qualche problema a consultare i documenti di mongodb sull'aggiornamento di oggetti/documenti annidati.Incrementa un valore in un oggetto nidificato?

Ho una collezione in cui i documenti simile a questa ..

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

Sto cercando di trovare il modo di incrementare il valore di playerScore sulla base del playername.

Suppongo che questo dipenda principalmente dal fatto che non comprendo il metodo NoSQL. Ho anche ripensamenti sull'uso di un array per i giocatori, quindi qualsiasi input sarebbe apprezzato.

Grazie!

+1

la sintassi non è valida –

risposta

18

La struttura che si desidera è:

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

Per incrementare il punteggio del giocatore di uno se il suo nome è Joe, utilizzare:

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

Sono confuso dalla struttura del poster. Cosa significa {playerName, playerScore}? –

+0

Vedo la confusione - presumevo che i giocatori fossero una serie di documenti in cui ogni documento conteneva {playerName: "string", playerScore: "number"} ma ovviamente non è quello che ha scritto. Dovremo aspettare fino al suo ritorno e chiarire, immagino ... –

+0

Sì, mi dispiace, pensavo che la struttura fosse abbastanza implicita da saltare specificando un tipo di dati per l'oggetto nidificato. Sono stato in grado di ottenere quello che hai specificato per lavorare con un singolo gioco, tuttavia non sembra funzionare bene se provo a cercare un gioco specifico. L'ho messo nel dimenticatoio per ora, mentre ho un po 'di lavoro reale, pensato :) – JackM

4

credo che si dovrebbe strutturare il documento invece come

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

Quindi è possibile aggiornare il punteggio con:

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

in che modo questo documento gestirà più lettori? Cosa c'era di sbagliato nella struttura del documento della domanda originale? Sembra che voglia rappresentare più giocatori in un gioco. Stai proponendo un documento per giocatore, per partita? Come saprai di aggiornare quello corretto, non c'è nessun selettore oltre a gameName nel tuo aggiornamento ... –

+0

playerName è solo un segnaposto qui. Potrebbe essere {$ inc: {"players.bobby.score": 1}} –

+0

questo non sembra un documento valido a meno che non si preveda realmente di avere un campo diverso _name_ per rappresentare ciascun giocatore. Come chiarimento, come otterresti una lista di nomi di giocatori per un particolare gioco da questa struttura del documento? I giocatori –

Problemi correlati