1

所以,我正在考虑实现这样的games属性,

{
  games: {
    won: 2,
    lost: 3,
    played: 5,
    winRatio: 40
  }
}

每次添加游戏赢/输数据时,我都想修改游戏比率。例如,如果在上面的例子中,如果玩家赢得另一场比赛,那么操作将是,

  1. 增加赢得1 _
  2. 增量播放1 _
  3. winRatio = 100 * 赢了/玩了

所以,{ $inc: { won: 1, played 1 } }还有一些其他的东西。那么,我该怎么做呢?一个明显的答案是获取数据,进行计算和发送数据。但我不想这样做。我想通过 MongoDB 方法和运算符来做到这一点。是否可以?

4

1 回答 1

1

询问

  • 管道更新需要 MongoDB >= 4.2(我们需要它来完成 1 个查询)
  • 而不是 -2 放入 js 变量来保存游戏的结果
    • 如果赢1放1
    • 如果输了 2 put -2 etc(负数表示输了)
  • 如果数字大于 0,则更新获胜,否则保留旧值
  • 如果数字 <0,则更新丢失(将 abs 值添加到丢失),否则保留旧值
  • 然后在第二次$set根据先前计算的值更新 winRation。

测试代码在这里

update(
{},
[{"$set": 
    {"games.won": 
      {"$cond": 
        [{"$gt": [-2, 0]}, {"$add": ["$games.won", -2]}, "$games.won"]},
     "games.lost": 
      {"$cond": 
        [{"$lt": [-2, 0]}, {"$add": ["$games.lost", {"$abs": -2}]},
          "$games.lost"]},
     "games.played": {"$add": ["$games.played", {"$abs": -2}]}}},
  {"$set": 
    {"games.winRatio":  
      {"$multiply": [100, {"$divide": ["$games.won", "$games.played"]}]}}}])

编辑

您可以简化查询并检查您的驱动程序,如果您知道游戏始终是 1 赢或输,您可以在驱动程序上编写类似 belloq 的内容(您也可以有一个变量并在没有 if 的情况下编写它/else,games.won 或 games.lost 上的 js 变量)

if(won)

update(
{},
[{"$set": 
    {"games.won": {"$add": ["$games.won", 1]},
      "games.played": {"$add": ["$games.played", 1]}}},
  {"$set": 
    {"games.winRatio": 
      {"$multiply": [100, {"$divide": ["$games.won", "$games.played"]}]}}}])

else

update(
{},
[{"$set": 
    {"games.lost": {"$add": ["$games.lost", 1]},
      "games.played": {"$add": ["$games.played", 1]}}},
  {"$set": 
    {"games.winRatio": 
      {"$multiply": [100, {"$divide": ["$games.won", "$games.played"]}]}}}])
于 2021-12-05T00:50:06.167 回答