根据mongoose集合中的2个字段查找玩家的排名



我在一个集合中有超过100,000个文档,我想首先根据他的totalCoins字段获得玩家的排名,如果2个玩家有相同的硬币,然后根据他们的level

以下是玩家收集的例子:

const players = [
{
_id: 1,
name: "abc",
totalCoins: 100,
level: 1
},
{
_id: 2,
name: "bcd",
totalCoins: 200,
level: 2
},
{
_id: 3,
name: "cde",
totalCoins: 300,
level: 3
},
{
_id: 4,
name: "def",
totalCoins: 100,
level: 4
},
{
_id: 5,
name: "efg",
totalCoins: 100,
level: 4
}
]

假设我正在查找具有_id = 4的玩家的排名。

如何在mongoose中实现这一点。

提前感谢。

如果你正在使用MongoDB 5,那么$rank方法应该工作(不是100%肯定,因为我使用4.4版)。

如果您没有使用5。X,那么这应该可以

步骤1 -首先基于级别对数据进行排序,然后是totalCoins

步骤2 -使用group和push

将排序后的数据推入数组步骤3 -在includeArrayIndex的帮助下展开数据并添加基于排序数组的文档索引,并将其命名为globalRank(您想要的任何名称:))

第4步-最后再次投影数据并在globalRank中添加1,以便秩从1开始而不是0(这返回的秩像1.0或2.0…如果你不想这样,你可以避免使用$add并在前端处理)

步骤5 - $match查找指定索引

db.collection.aggregate([
{
$project: {
_id: 1,
name: "$name",
totalCoins: "$totalCoins",
level: "$level",
},
},
{
$sort: {
level: -1,
totalCoins: -1,
},
},
{
$group: {
_id: null,
arr: {
$push: {
_id: "$_id",
name: "$name",
totalCoins: "$totalCoins",
level: "$level",
},
},
},
},
{
$unwind: {
path: "$arr",
includeArrayIndex: "globalRank",
},
},
{
$project: {
_id: "$arr._id",
name: "$arr.name",
level: "$arr.level",
totalCoins: "$arr.totalCoins",
globalRank: { $add: ["$globalRank", 1] },
},
},
{ $match: { _id: 4 } },
]);
collection.count({ 
"$expr": {
"$gt": [
{ "$add": [ "$totalCoins", {"$divide":["$level",10000] ] },
100.0004
]
}
})

这个想法是计算硬币/等级比用户高的记录的数量。我在这里的想法是将关卡除以最大关卡+ 1(这里的关卡是最大9999),所以你最终得到的总是小于1的小数。当你把硬币加起来,你会得到100.0004个硬币。的水平。然后,只需对两个数字进行比较。

最新更新