Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

329
Vistas
MongoDB, establece una propiedad calculando otras propiedades

Entonces, estoy pensando en implementar una propiedad de games como esta,

 { games: { won: 2, lost: 3, played: 5, winRatio: 40 } }

Quiero modificar la proporción de juegos cada vez que agrego datos de juegos ganados/perdidos. Por ejemplo, si en el ejemplo anterior el jugador gana otro juego, entonces las operaciones serían,

  1. incremento ganado por 1
  2. incremento jugado por 1
  3. winRatio = 100 * ganado / jugado

Entonces, { $inc: { won: 1, played 1 } } y algunas otras cosas. Entonces, ¿cómo lo hago? Una respuesta obvia es buscar datos, hacer cálculos y enviar datos. Pero no quiero hacerlo. Quiero hacer esto con los métodos y operadores de MongoDB. ¿Es posible?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Consulta

  • la actualización de la canalización requiere MongoDB >= 4.2 (necesitamos hacerlo con 1 consulta)
  • en lugar de -2, coloque la variable js para contener el resultado del juego
    • si gana 1 pon 1
    • si se pierde 2 poner -2 etc (negativo significa perdido)
  • actualizaciones ganadas si el número es> 0, de lo contrario, mantenga el valor anterior
  • actualizaciones perdidas si el número es <0 (agrega el valor abs a perdido) de lo contrario, mantenga el valor anterior
  • y luego, en el segundo $set , actualiza winRation, en función de los valores calculados previamente.

Código de prueba aquí

 update( {}, [{"$set": {"games.won": {"$cond": [{"$gt": [-2, 0]}, {"$add": ["$games.won", -2]}, "$games.won"]}, "games.lost": {"$cond": [{"$lt": [-2, 0]}, {"$add": ["$games.lost", {"$abs": -2}]}, "$games.lost"]}, "games.played": {"$add": ["$games.played", {"$abs": -2}]}}}, {"$set": {"games.winRatio": {"$multiply": [100, {"$divide": ["$games.won", "$games.played"]}]}}}])

Editar

Puede simplificar la consulta y verificar también en su controlador, también si sabe que el juego siempre es 1 ganado o perdido, puede escribir algo como el belloq en su controlador (también puede tener una variable y escribirlo sin si /else, variable js en games.won o games.lost)

 if(won) update( {}, [{"$set": {"games.won": {"$add": ["$games.won", 1]}, "games.played": {"$add": ["$games.played", 1]}}}, {"$set": {"games.winRatio": {"$multiply": [100, {"$divide": ["$games.won", "$games.played"]}]}}}]) else update( {}, [{"$set": {"games.lost": {"$add": ["$games.lost", 1]}, "games.played": {"$add": ["$games.played", 1]}}}, {"$set": {"games.winRatio": {"$multiply": [100, {"$divide": ["$games.won", "$games.played"]}]}}}])
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda