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!
Tu enfoque está bien. Sin embargo, hay algunos defectos:
updateOne actualiza exactamente un documento como su nombre lo indica. Por lo tanto multi: true está obsoleto.$inc: { score: player.score } , no " Score "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.