用例:
我们在MongoDB集合playerProfiles
中拥有5亿名视频游戏玩家。每个文档都有几个属性,如wins
或kills
。现在,我们要为这些属性创建排行榜,以便我们可以找出每个玩家在wins
或kills
中的排名。
对于排名前100的排行榜,我只是按照其中一个属性对集合进行排序,然后缓存结果,让我们在redis中说5分钟。我正在努力的是如何使所有玩家资料。
问题:
我应该如何获得wins
或kills
的所有玩家排名,以免它压倒数据库服务器?如果有意义,我可以自由地使用其他数据库系统来解决这个问题。
我的想法:
我的第一个想法是创建一个自己的mongodb集合,该集合仅包含玩家的ID及其kills
和wins
的排名。然后我会定期更新这个系列。但即使更新这个500米播放器配置文件的集合也应该花费大量时间。对于这类问题,有没有更好的方法?
答案 0 :(得分:0)
您可以使用mongodb聚合来实现此目的。您基本上按胜负对文档进行排序,然后在保留索引的同时将每个用户推送到一个新数组中,此索引是用户的排名,之后您可以简单地使用'unwind '在这个新创建的数组上找到有问题的用户,这将为您提供用户的排名以及其他详细信息。
以下是示例汇总管道:
[{
"$sort": {
"wins": -1
}
},
{
"$group": {
"_id": false,
"players": {
"$push": {
"_id": "$_id",
"playerId": "$playerId",
"wins": "$wins"
}
}
}
},
{
"$unwind": {
"path": "$players",
"includeArrayIndex": "rank"
}
},
{
"$match": {
"players._id": 1234567890
}
}]
现在您应该拥有一个带有玩家详细信息的等级字段,该字段将根据获胜情况告诉您玩家的排名,您可以扩展击杀次数并将其添加到排序中。
希望这会有所帮助! :)