大型馆藏的排行榜排名

时间:2018-04-23 09:15:45

标签: mongodb

用例:

我们在MongoDB集合playerProfiles中拥有5亿名视频游戏玩家。每个文档都有几个属性,如winskills。现在,我们要为这些属性创建排行榜,以便我们可以找出每个玩家在winskills中的排名。

对于排名前100的排行榜,我只是按照其中一个属性对集合进行排序,然后缓存结果,让我们在redis中说5分钟。我正在努力的是如何使所有玩家资料

问题:

我应该如何获得winskills的所有玩家排名,以免它压倒数据库服务器?如果有意义,我可以自由地使用其他数据库系统来解决这个问题。

我的想法:

我的第一个想法是创建一个自己的mongodb集合,该集合仅包含玩家的ID及其killswins的排名。然后我会定期更新这个系列。但即使更新这个500米播放器配置文件的集合也应该花费大量时间。对于这类问题,有没有更好的方法?

1 个答案:

答案 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
    }
}]

现在您应该拥有一个带有玩家详细信息的等级字段,该字段将根据获胜情况告诉您玩家的排名,您可以扩展击杀次数并将其添加到排序中。

希望这会有所帮助! :)