首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化我的MongoDB Upsert语句?

问如何优化我的MongoDB Upsert语句?
EN

Stack Overflow用户
提问于 2021-03-23 06:35:19
回答 1查看 35关注 0票数 1

我们做出了将数据库从SQL转换到noSQL的决定,我对最佳实践以及我目前的实现是否可以改进提出了一些问题。

我现在的SQL实现了游戏结束后对玩家数据的更新。

代码语言:javascript
复制
   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_id是否存在来更新现有玩家。如果是这样的话,除了其他事情之外,还要更新他们的分数。否则插入一个新播放器。

Mongo实施

代码语言:javascript
复制
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 },
       );
    });

蒙戈有更好的方法来实现这一点吗?我试着使用updateMany和bulkUpdate,但没有得到预期的结果。

除了mongo.db之外,还有哪些技巧、技巧或资源可以推荐给那些从SQL迁移到noSQL的用户呢?

再次感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-23 07:33:00

你的方法很好。然而,也有一些缺陷:

  • 命令updateOne按照名称的含义准确地更新一个文档。因此,multi: true已经过时。
  • 字段名区分大小写(与大多数SQL数据库不同)。它应该是$inc: { score: player.score },而不是“S核”
  • 字段Player_Name不存在,它将永远找不到任何要更新的文档。

你的命令应该是这样的:

代码语言:javascript
复制
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命令时,效果更好。

当然,当您执行第一个find、delete、insert、update时,您将看到许多与SQL的类比,但是当您接近聚合框架时,如果您试图将它们转换为SQL,或者相反,您就会迷路。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66758316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档