Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

570
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda