Как рассчитать рейтинг из общего количества баллов в агрегированном конвейере для игрового приложения

Я работаю над игровым приложением, у которого будут тысячи пользователей.

Моя текущая совокупная производительность конвейера

[
    {
        "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, но это кажется довольно неэффективным.

Заранее спасибо.

Комментарии приветствуются.

Ниже приведено изображение примера таблицы лидеров.

Как рассчитать рейтинг из общего количества баллов в агрегированном конвейере для игрового приложения

Ну, вы не можете ... Для получения дополнительной информации проверьте здесь 1) stackoverflow.com/questions/50888582/… и здесь 2) stackoverflow.com/questions/50870664/…

Ashh 22.06.2018 09:18

Возможный дубликат Как сортировать мангуста?

James 22.06.2018 09:21

@James, мой вопрос касается не сортировки, а концепции таблицы лидеров и системы рангов.

Ratan Uday Kumar 22.06.2018 09:22

@Anthony Winzlet, мой вопрос не связан с номером строки, а с рангом, документы можно хранить где угодно

Ratan Uday Kumar 22.06.2018 09:29

Да, я понял, что вы хотите ... Пожалуйста, посмотрите две ссылки в моем первом комментарии ... они такие же, как вам нужно в вопросе ...

Ashh 22.06.2018 09:34

вторая ссылка не работает и первая ссылка другая, моя другая

Ratan Uday Kumar 22.06.2018 09:36

@RatanUdayKumar, для меня это очень похоже на сортировку .... вы хотите получить из Mongo список записей в порядкеTotal_Points, правильно? Вы также заявляете в предыдущем комментарии "документы можно хранить где угодно", поэтому предположительно порядок хранения не имеет значения - поэтому это говорит мне, что вы хотите получить свои данные отсортированный. Если это не так, то, к сожалению, ваш вопрос неясен.

James 22.06.2018 10:04

@Anthony, я отредактировал свой вопрос, теперь мне не нужно сортировать

Ratan Uday Kumar 22.06.2018 11:20

@James Чем вопрос OP отличается от сортировки, так это "Total_Points" ... Как будет работать сортировка, если на двух USERID будет одинаковый "Total_rank"? Таким образом, в это время сортировка не удастся, потому что OP хочет такой же ранг на USERID's, который имеет одинаковые «Total_Points» ...

Ashh 22.06.2018 12:16

@AnthonyWinzlet на основе желаемого пользователем вывода - отсортируйте по Total_Points, а затем по UserID .... вы можете только проработать детали в вопросе, и, как я уже отмечал, вопрос OP не достаточно ясен, чтобы ответить на него полностью . Мне кажется, что ОП хочет сгруппировать и отсортировать, но опять же, я не могу ответить, пока это не проясняется.

James 22.06.2018 12:30

@James вопрос ясен, мне нужен результат базы рейтинга, такой как таблица лидеров, я опубликовал изображение dream11

Ratan Uday Kumar 22.06.2018 13:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
12
1 118
3

Ответы 3

Вот что я придумал.

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

Ratan Uday Kumar 25.06.2018 05:56

Вы не можете вставлять значения при получении данных, вы можете вставлять их только после того, как получили их. Лучшее, что вы можете сделать, это отсортировать пользователей по Total_Points в вашем запросе, а затем вычислить рейтинг после получения данных. Вы сказали, что можете использовать javascript, и мой ответ делает то, что вам нужно, просто нажмите «Выполнить фрагмент кода» и проверьте журнал.

Joseph Webber 25.06.2018 15:00

Я знаю javascript, но мне нужна сама функциональность от mongodb, потому что для тысячи данных это займет очень много времени

Ratan Uday Kumar 26.06.2018 05:52

В настоящее время компьютеры могут выполнять миллионы вычислений в секунду. Перебор 100 000 пользователей займет всего несколько секунд или меньше. Если вас действительно беспокоит скорость, вы можете ограничить количество пользователей, возвращаемых вашим запросом, до 100 или около того, прежде чем вычислять их рейтинг, а остальных скрыть за кнопкой «Показать все».

Joseph Webber 26.06.2018 14:24

Не думайте, что вы можете сделать это с агрегатом.

Вы можете сделать это одной строкой с помощью 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

Ratan Uday Kumar 25.06.2018 05:56

вы можете сделать это с помощью агрегата. вы можете проверить мой ответ на похожий вопрос (это похоже на дубликат): 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
    }
}]

Другие вопросы по теме