javascript - 如何从游戏应用程序的聚合管道中的总点数计算排名
问题描述
我正在开发的游戏应用程序将拥有成千上万的用户。
我当前的汇总管道输出
[
{
"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 循环操作数据,但它似乎相当低效。
提前致谢。
非常感谢评论。
下面是示例排行榜的图像
解决方案
不要认为你可以用聚合来做到这一点。
您可以使用 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}
推荐阅读
- python - nbdev 和“协程”对象不可下标
- azure - 将事件中心消息发送到 Blob 存储的 Azure 事件中心捕获的替代方案?
- windows - 检测 Windows 显示分辨率更改结束
- android - 将查询更改为通过两个选项进行搜索
- google-sheets - 如何根据跨 2 个完整工作表的通用单元格值/日期导入范围
- python - 使用 Rest API 的身份验证凭据
- c# - 无法重置没有特定角色的登录用户的密码
- javascript - TypeORM,带有 CAST 和 AS 的 createQueryBuilder,有什么选择吗?
- reactjs - 从选定的标签填充值 react-select
- python-3.x - python - 从file1中的变量在file2中创建变量并在file1中使用