Чтобы построить leaderboard в MongoDB, сохраняй данные игроков в коллекции scores с документами, содержащими playerId, username и score. Создай индекс по убыванию на поле score, чтобы сделать запросы рейтинга быстрыми и эффективными:
db.scores.createIndex({ score: -1 })
Используй aggregation framework с $sort и $limit, чтобы эффективно получить топ-N игроков. Этот подход задействует индекс и избегает полного сканирования коллекции:
db.scores.aggregate([
{ $sort: { score: -1 } },
{ $limit: 10 }
])
Используй стадию $setWindowFields, чтобы вычислить ранг каждого игрока без множественных запросов. Это наиболее эффективный способ назначить позиции по всему датасету:
{ $setWindowFields: {
sortBy: { score: -1 },
output: {
rank: { $rank: {} }
}
}}
Для real-time обновлений используй Change Streams, чтобы слушать изменения score и мгновенно запускать пересчёт рангов:
insert и updateЧтобы получить ранг конкретного игрока, посчитай все документы с более высоким score и добавь единицу:
db.scores.countDocuments({ score: { $gt: playerScore } })
// rank = result + 1
Descending индекс на поле score в MongoDB позволяет pipeline агрегации избежать полного сканирования коллекции при получении топ-N игроков с использованием $sort и $limit.
Новый — ещё не проверен сообществом
Вы