Estoy trabajando para mover mi base de datos de sqlite3 a mongo. Fui a la universidad de mongo, pero no estoy seguro de haber encontrado un buen ejemplo de upserting a granel.
Caso de uso : el usuario carga un archivo de datos con una lista de jugadores y sus estadísticas. La aplicación necesita actualizar un jugador o agregar un nuevo jugador si aún no existe.
Implementación actual : la función toma una lista de jugadores y crea una declaración SQL.
let template = '(Player.Rank, Player.Player_ID, Player.Player, Player.Score, TTP, 1),(Player.Rank, Player_ID, ...) ... (... TTP, 1)'; const 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, TPP=TPP+excluded.TPP, Games_Played=Games_Played+1`; db.run(stmt, callback);Espero que cada documento sea una liga que contenga jugadores, juegos y gerentes. Plantilla de documento Mongo DB
{ "LEAGUE_ID": "GEO_SAM", "Players": [ { "id": "PlayerID", "name": "Player", "score": "Score", "rank": "Rank", "xPlayed": "Games_Played", "ttp": "TTP" } ], "Managers": [ {...} ], "Games": [ {...} ] }Estoy totalmente perdido y no estoy seguro de cómo hacer esto. ¿Necesito crear un bucle y pedirle a mongo que se inserte en cada iteración? He buscado en innumerables ejemplos, pero todos usan valores estáticos codificados.
Aquí está mi ejemplo de prueba.
const query = { League_id : "GEO_SAM", Players.$.id: $in{ $Players }}; const update = { $inc: { score: $Player.Score}}; const options = { upsert: true }; collection.updateMany(query, update, options);Tampoco entiendo cómo pasar todo el objeto del jugador para empujarlo a la matriz si no se encuentra el player_id.
Mi solución fue crear un campo de metadatos que contuviera el ID de la liga con un solo jugador. Si alguien más tiene una solución mejor, me encantaría saber de usted.
{ MetaData: { "LEAGUE_ID": "GEO_SAM"}, Player: { "id": "PlayerID", "name": "Player", "score": "Score", "rank": "Rank", "xPlayed": "Games_Played", "ttp": "TTP" } }Luego mapeé los valores e inserté cada uno.
client.connect().then((client) => { const db = client.db(dbName); const results = Players.map((player) => { db.collection('Players').updateOne( { Player_Name: player.Player_ID }, { $setOnInsert: { Player_ID: player.Player_ID, Player: player.Player, Rank: player.Rank, }, $inc: { Score: player.Score, Games_Played: 1, TPP: player.TPP }, }, { upsert: true, multi: true }, ); });