MongoDB,通过计算其他属性设置一个属性
MongoDB, set a property by calculating other properties
所以,我正在考虑像这样实施 games
属性,
{
games: {
won: 2,
lost: 3,
played: 5,
winRatio: 40
}
}
我想在每次添加游戏输赢数据时修改游戏比率。例如,如果在上面的例子中,如果玩家赢得了另一场比赛,那么操作将是
,
- 增加赢得1
- 增加 播放 1
- winRatio = 100 * 赢/玩
所以,{ $inc: { won: 1, played 1 } }
和其他一些东西。
那么,我该怎么做呢?一个显而易见的答案是获取数据、进行计算和发送数据。但我不想这样做。我想通过 MongoDB 方法和运算符来做到这一点。可能吗?
查询
- 管道更新需要 MongoDB >= 4.2(我们需要它来完成 1 个查询)
- 将js变量代替-2来保存游戏结果
- 如果赢 1 放 1
- if lost 2 put -2 etc (negative means lost)
- 如果数字 >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 上的 js 变量或 games.lost)
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"]}]}}}])
所以,我正在考虑像这样实施 games
属性,
{
games: {
won: 2,
lost: 3,
played: 5,
winRatio: 40
}
}
我想在每次添加游戏输赢数据时修改游戏比率。例如,如果在上面的例子中,如果玩家赢得了另一场比赛,那么操作将是 ,
- 增加赢得1
- 增加 播放 1
- winRatio = 100 * 赢/玩
所以,{ $inc: { won: 1, played 1 } }
和其他一些东西。
那么,我该怎么做呢?一个显而易见的答案是获取数据、进行计算和发送数据。但我不想这样做。我想通过 MongoDB 方法和运算符来做到这一点。可能吗?
查询
- 管道更新需要 MongoDB >= 4.2(我们需要它来完成 1 个查询)
- 将js变量代替-2来保存游戏结果
- 如果赢 1 放 1
- if lost 2 put -2 etc (negative means lost)
- 如果数字 >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 上的 js 变量或 games.lost)
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"]}]}}}])