我正在开发的游戏应用程序将拥有成千上万的用户。
我当前的总管道输出
[
{
"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循环来处理数据,但效率似乎很低。
谢谢。
不胜感激。
下面是示例排行榜的图像
答案 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
}
}]