如何从游戏应用程序的总管道中的总点计算排名

时间:2018-06-22 07:13:47

标签: javascript node.js mongodb mongoose

我正在开发的游戏应用程序将拥有成千上万的用户。

我当前的总管道输出

[
    {
        "USERID": "U0004",
        "Total_Points": 10
    },
    {
        "USERID": "U0001",
        "Total_Points": 8
    },
    {
        "USERID": "U0006",
        "Total_Points": 8
    },
    {
        "USERID": "U0002",
        "Total_Points": 2
    },
    {
        "USERID": "U0003",
        "Total_Points": 1
    },

    {
        "USERID": "U0005",
        "Total_Points": 1
    }
]

预期产量

[
    {
        "USERID": "U0004",
        "Total_Points": 10,
        "Rank": 1
    },
    {
        "USERID": "U0001",
        "Total_Points": 8,
        "Rank": 2
    },
    {
        "USERID": "U0006",
        "Total_Points": 8,
        "Rank": 2
    },
    {
        "USERID": "U0002",
        "Total_Points": 2,
        "Rank": 4
    },
    {
        "USERID": "U0003",
        "Total_Points": 1,
        "Rank": 5
    },

    {
        "USERID": "U0005",
        "Total_Points": 1,
        "Rank": 5
    }
]

采用排行榜排名概念,这是从mongodb聚合中获取输出的最佳,最优化的方法。

我在项目中使用mongoose mongodb连接。

我可以使用for循环来处理数据,但效率似乎很低。

谢谢。

不胜感激。

下面是示例排行榜的图像

link

3 个答案:

答案 0 :(得分:0)

这就是我的想法。

let bigRectangle = new Rectangle(300,300);
let smallRectangle = new Rectangle(50,50);

答案 1 :(得分:0)

不要以为您可以使用汇总功能。

您可以使用javascript在一行中完成此操作。 对数组进行排序,然后映射以获取带有索引的排名。

  a = [
    {
        "USERID": "U0004",
        "Total_Points": 10
    },
    {
        "USERID": "U0001",
        "Total_Points": 8
    },
    {
        "USERID": "U0006",
        "Total_Points": 8
    },
    {
        "USERID": "U0002",
        "Total_Points": 2
    },
    {
        "USERID": "U0003",
        "Total_Points": 1
    },

    {
        "USERID": "U0005",
        "Total_Points": 1
    }
]
a = a.sort(function(a, b){
    return b.Total_Points - a.Total_Points;
}).map(function(e, i){
  e.Rank = (i + 1);
  return e;
});

{USERID: "U0004", Total_Points: 10, Rank: 1}
{USERID: "U0001", Total_Points: 8, Rank: 2}
{USERID: "U0006", Total_Points: 8, Rank: 3}
{USERID: "U0002", Total_Points: 2, Rank: 4}
{USERID: "U0003", Total_Points: 1, Rank: 5}
{USERID: "U0005", Total_Points: 1, Rank: 6}

答案 2 :(得分:0)

您可以通过聚合来做到这一点。 您可以检查类似问题的答案(似乎是重复的):https://stackoverflow.com/a/62402340/6134150

总而言之,在聚合管道中,您可以: 1)按分数或分数对文档进行排序 2)在保留索引的同时将玩家推入新的数组,该索引可以用作排名 3)从新组建的阵列中找到排名前的 n 名玩家和/或有问题的玩家,该玩家将有一个描述玩家排名的字段。

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