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

566
Vistas
¿Cómo puedo optimizar mi declaración MongoDB Upsert?

Se tomó la decisión de cambiar nuestra base de datos de SQL a noSQL y tengo algunas preguntas sobre las mejores prácticas y si se puede mejorar mi implementación actual.

Mi implementación actual de SQL para alterar los datos del jugador después de un juego.

 let template = Players.map( (player) => `( ${player.Rank},"${player.Player_ID}","${player.Player}",${player.Score},${tpp},1 )`, ).join(','); let stmt = `INSERT INTO playerStats (Rank, Player_ID, Player, Score, TPP, Games_Played) VALUES ${template} ON CONFLICT(Player_ID) DO UPDATE SET Score = Score+excluded.Score, Games_Played=Games_Played+1, TPP=TPP+excluded.TPP`; db.run(stmt, function (upsert_error) { ...

El código esperado es actualizar los jugadores existentes comprobando si existe un Player_id actual. Si es así, actualice su puntuación, entre otras cosas. De lo contrario, inserte un nuevo jugador.

Implementación de Mongo

 const players = [ { name: 'George', score: 10, id: 'g65873' }, { name: 'Wayne', score: 100, id: 'g63853' }, { name: 'Jhonny', score: 500, id: 'b1234' }, { name: 'David', score: 3, id: 'a5678' }, { name: 'Dallas', score: 333333, id: 'a98234' }, ]; const db = client.db(dbName); const results = players.map((player) => { // updateOne(query, update, options) db.collection('Players') .updateOne( { Player_Name: player.name }, { $setOnInsert: { Player_Name: player.name, id: player.id }, $inc: { Score: player.score }, }, { upsert: true, multi: true }, ); });

¿Hay una mejor manera en mongo para implementar esto? Intenté usar updateMany y bulkUpdate y no obtuve los resultados que esperaba.

¿Hay algún consejo, truco o recurso además de mongo.db que recomendaría para aquellos que pasan de SQL a noSQL?

¡Gracias de nuevo!

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

0

Tu enfoque está bien. Sin embargo, hay algunos defectos:

  • El comando updateOne actualiza exactamente un documento como su nombre lo indica. Por lo tanto multi: true está obsoleto.
  • Los nombres de campo distinguen entre mayúsculas y minúsculas (a diferencia de la mayoría de las bases de datos SQL). Debería ser $inc: { score: player.score } , no " Score "
  • El campo Player_Name no existe, nunca encontrará ningún documento para actualizar.

Entonces, su comando debería ser así:

 db.collection('Players').updateOne( { name: player.name }, //or { id: player.id } ? { $setOnInsert: { name: player.name, id: player.id }, $inc: { score: player.score }, }, { upsert: true } )

Según mi experiencia, pasar de SQL a NoSQL es más difícil si intenta traducir la instrucción SQL que tiene en mente en un comando NoSQL uno por uno. Para mí funcionó mejor cuando eliminé la idea de SQL e intenté comprender y desarrollar el comando NoSQL desde cero.

Por supuesto, cuando haga su primera find , delete , insert , update , verá muchas analogías con SQL, pero más recientemente, cuando se acerque al marco de agregación , estará perdido si intenta traducirlas a SQL o viceversa.

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