2012-05-06 13 views
13

Estoy jugando con mongodb y node.js este fin de semana y estoy teniendo problemas para revisar los documentos de mongodb con respecto a la actualización de objetos/documentos anidados.¿Incrementar un valor en un objeto anidado?

Tengo una colección en la que los documentos se ven así ..

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

Estoy tratando de encontrar la manera de incrementar el valor de playerScore basado en el nombre del jugador.

Supongo que esto se debe principalmente a que no entiendo el método NoSQL. Incluso tengo dudas sobre el uso de una matriz para los jugadores, por lo que cualquier comentario sería apreciado.

Gracias!

+1

su sintaxis no es válida –

Respuesta

18

La estructura que desea es:

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

Para incrementar la puntuación del jugador en uno si su nombre es Joe, debe usar:

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

Estoy confundido por la estructura del cartel. ¿Qué significa {playerName, playerScore}? –

+0

Veo la confusión: suponía que los jugadores eran una serie de documentos en los que cada documento contenía {playerName: "string", playerScore: "number"} pero, por supuesto, eso no es lo que escribió. Tendremos que esperar hasta que regrese y aclarar, supongo ... –

+0

Sí, lo siento, pensé que la estructura estaba lo suficientemente implícita como para omitir la especificación de un tipo de datos para el objeto anidado. Pude obtener lo que especificaste para trabajar con un solo juego, sin embargo, no parecía funcionar tan bien si trato de buscar un juego específico. He puesto esto en un segundo plano por ahora mientras obtengo un trabajo real hecho :) :) – JackM

4

yo creo que habría que estructurar el documento en lugar como

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

A continuación, puede actualizar el marcador:

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

¿cómo manejará este documento varios jugadores? ¿Qué estaba mal con la estructura del documento de la pregunta original? Parece que quiere representar a varios jugadores en un juego. ¿Estás proponiendo un documento por jugador, por juego? Cómo sabrá actualizar la correcta, no hay un selector que no sea GameName en su actualización ... –

+0

playerName es solo un marcador de posición aquí. Podría ser {$ inc: {"players.bobby.score": 1}} –

+0

esto no parece un documento válido a menos que realmente planee tener un campo diferente _name_ para representar a cada jugador. Como aclaración, ¿cómo obtendrías una lista de nombres de jugador para un juego particular de esta estructura de documento? –

Cuestiones relacionadas