询问
- 管道更新需要 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"]}]}}}])