Node.js 如何优化我的MongoDB Upsert语句?

Node.js 如何优化我的MongoDB Upsert语句?,node.js,mongodb,Node.js,Mongodb,我们决定将数据库从SQL切换到noSQL,我对最佳实践有一些疑问,以及我当前的实现是否可以改进 我当前的SQL实现用于在游戏结束后升级玩家数据 let template = Players.map( (player) => `( ${player.Rank},"${player.Player_ID}","${player.Player}",${player.Score},${tpp},1

我们决定将数据库从SQL切换到noSQL,我对最佳实践有一些疑问,以及我当前的实现是否可以改进

我当前的SQL实现用于在游戏结束后升级玩家数据

   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) { ...
预期代码是通过检查当前
Player\u id
是否存在来更新现有播放器。如果是的话,更新他们的分数。否则请插入一个新的播放器

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 },
       );
    });
mongo是否有更好的方法来实现这一点?我尝试使用updateMany和bulkUpdate,但没有得到预期的结果

除了mongo.db之外,对于那些从SQL迁移到noSQL的人,您还有什么建议、技巧或资源吗


再次感谢

你的方法很好。但是,也存在一些缺陷:

  • 命令
    updateOne
    只更新名称所示的一个文档。因此
    multi:true
    这是过时的
  • 字段名区分大小写(与大多数SQL数据库不同)。它应该是
    $inc:{score:player.score}
    ,而不是“Score”
  • 字段
    Player\u Name
    不存在,它将永远找不到任何要更新的文档
因此,您的命令应该如下所示:

db.collection('Players').updateOne(
   { name: player.name }, //or { id: player.id } ?
   {
      $setOnInsert: { name: player.name, id: player.id },
      $inc: { score: player.score },
   },
   { upsert: true }
)
根据我的经验,如果您试图将脑海中的SQL语句一个接一个地转换为NoSQL命令,那么从SQL迁移到NoSQL会更加困难。对我来说,当我摒弃了SQL的思想并尝试从头开始理解和开发NoSQL命令时,它工作得更好


当然,当您第一次执行
查找
删除
插入
更新
时,您将看到许多与SQL的类似之处,但最近当您接近SQL时,如果您试图将它们转换为SQL,您就会迷失方向。

谢谢!这真的帮了我的忙!