Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

328
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!