大型集合的排行榜排名

9 浏览
0 Comments

大型集合的排行榜排名

使用案例:

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

对于前100名的排行榜,我会简单地按照其中一种属性对集合进行排序,并将结果缓存到redis中,缓存时间为5分钟。我遇到的问题是如何使这个方法适用于所有玩家档案

问题是:

我应该如何获取每个玩家在winskills方面的排名,以免超过数据库服务器的承受能力?如果有意义的话,我可以使用其他数据库系统来解决这个问题。

我的想法:

我最初的想法是创建一个自己的MongoDB集合,其中只包含玩家的ID以及它们在killswins方面的排名。然后我会定期更新这个集合。但是,即使更新这个包含5亿个玩家档案的集合也需要相当长的时间。是否有更好的方法来解决这类问题?

0
0 Comments

在处理大型集合中的排行榜时,可能会遇到以下问题:如何根据胜利次数和击杀数对文档进行排序,并将每个用户推入一个新的数组,并保留索引,这个索引即为用户的排名。为了解决这个问题,可以使用MongoDB的aggregate方法。下面是一个示例的聚合管道:

[{
    "$sort": { 
        "wins": -1
    }
},
{
    "$group": {
        "_id": false,
        "players": {
            "$push": {
                "_id": "$_id",
                "playerId": "$playerId",
                "wins": "$wins"
            }
        }
    }
},
{
    "$unwind": {
        "path": "$players",
        "includeArrayIndex": "rank"
    }
},
{
    "$match": {
        "players._id": 1234567890
    }
}]

通过这个聚合管道,您将得到一个包含玩家详细信息的rank字段,该字段将告诉您玩家根据胜利次数的排名,您可以扩展并添加击杀数进行排序。希望这对您有所帮助! 🙂

0