Я работаю над игровым приложением, у которого будут тысячи пользователей.
Моя текущая совокупная производительность конвейера
[
{
"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, но это кажется довольно неэффективным.
Заранее спасибо.
Комментарии приветствуются.
Ниже приведено изображение примера таблицы лидеров.
Возможный дубликат Как сортировать мангуста?
@James, мой вопрос касается не сортировки, а концепции таблицы лидеров и системы рангов.
Возможный дубликат Добавьте какой-то номер строки в агрегатную команду / конвейер mongodb
@Anthony Winzlet, мой вопрос не связан с номером строки, а с рангом, документы можно хранить где угодно
Да, я понял, что вы хотите ... Пожалуйста, посмотрите две ссылки в моем первом комментарии ... они такие же, как вам нужно в вопросе ...
вторая ссылка не работает и первая ссылка другая, моя другая
@RatanUdayKumar, для меня это очень похоже на сортировку .... вы хотите получить из Mongo список записей в порядкеTotal_Points, правильно? Вы также заявляете в предыдущем комментарии "документы можно хранить где угодно", поэтому предположительно порядок хранения не имеет значения - поэтому это говорит мне, что вы хотите получить свои данные отсортированный. Если это не так, то, к сожалению, ваш вопрос неясен.
@Anthony, я отредактировал свой вопрос, теперь мне не нужно сортировать
@James Чем вопрос OP отличается от сортировки, так это "Total_Points" ... Как будет работать сортировка, если на двух USERID будет одинаковый "Total_rank"? Таким образом, в это время сортировка не удастся, потому что OP хочет такой же ранг на USERID's, который имеет одинаковые «Total_Points» ...
@AnthonyWinzlet на основе желаемого пользователем вывода - отсортируйте по Total_Points, а затем по UserID .... вы можете только проработать детали в вопросе, и, как я уже отмечал, вопрос OP не достаточно ясен, чтобы ответить на него полностью . Мне кажется, что ОП хочет сгруппировать и отсортировать, но опять же, я не могу ответить, пока это не проясняется.
@James вопрос ясен, мне нужен результат базы рейтинга, такой как таблица лидеров, я опубликовал изображение dream11



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вот что я придумал.
var users = [
{ "USERID": "U0001", "Total_Points": 8 },
{ "USERID": "U0004", "Total_Points": 10 },
{ "USERID": "U0003", "Total_Points": 1 },
{ "USERID": "U0006", "Total_Points": 8 },
{ "USERID": "U0002", "Total_Points": 2 },
{ "USERID": "U0005", "Total_Points": 1 }
];
users.sort((a, b) => b.Total_Points - a.Total_Points);
for (let i = 0; i < users.length; i++) {
let totalPoints = users[i].Total_Points;
let usersWithRank = users.filter(user => user.Total_Points === totalPoints);
for (let user of usersWithRank) {
user.Rank = i + 1;
}
i += usersWithRank.length - 1;
}
console.info(users);Я могу делать javascript, и если количество человек с таким же баллом, то ранг должен быть таким же, как в моем вопросе. Я хочу функциональность от самого mongodb
Вы не можете вставлять значения при получении данных, вы можете вставлять их только после того, как получили их. Лучшее, что вы можете сделать, это отсортировать пользователей по Total_Points в вашем запросе, а затем вычислить рейтинг после получения данных. Вы сказали, что можете использовать javascript, и мой ответ делает то, что вам нужно, просто нажмите «Выполнить фрагмент кода» и проверьте журнал.
Я знаю javascript, но мне нужна сама функциональность от mongodb, потому что для тысячи данных это займет очень много времени
В настоящее время компьютеры могут выполнять миллионы вычислений в секунду. Перебор 100 000 пользователей займет всего несколько секунд или меньше. Если вас действительно беспокоит скорость, вы можете ограничить количество пользователей, возвращаемых вашим запросом, до 100 или около того, прежде чем вычислять их рейтинг, а остальных скрыть за кнопкой «Показать все».
Не думайте, что вы можете сделать это с агрегатом.
Вы можете сделать это одной строкой с помощью 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}
Я могу делать javascript, и если количество человек с таким же баллом, то ранг должен быть таким же, как в моем вопросе. Я хочу функциональность от самого mongodb
вы можете сделать это с помощью агрегата. вы можете проверить мой ответ на похожий вопрос (это похоже на дубликат): https://stackoverflow.com/a/62402340/6134150
Подводя итог, в агрегатном конвейере вы можете: 1) сортировать документы по баллам или баллам 2) вставьте игроков в новый массив с сохранением индекса, этот индекс может действовать как ранг 3) найдите лучших игроков п из вновь сформированного массива и / или игрока, о котором идет речь, у этого игрока (ов) будет поле, отображающее ранг игрока.
[{
"$sort": {
"wins": -1
}
},
{
"$group": {
"_id": false,
"players": {
"$push": {
"_id": "$_id",
"playerId": "$playerId",
"wins": "$wins"
}
}
}
},
{
"$unwind": {
"path": "$players",
"includeArrayIndex": "rank"
}
},
{
"$match": {
"players._id": 1234567890
}
}]
Ну, вы не можете ... Для получения дополнительной информации проверьте здесь 1) stackoverflow.com/questions/50888582/… и здесь 2) stackoverflow.com/questions/50870664/…