2013-04-15 4 views
1

Я использую MongoDB, Mongoose и Node для хранения информации о пользователе для игры.Несколько схем в MongoDB (с использованием Mongoose)

У меня есть ситуации, когда я ищу, чтобы иметь два сета записей для игры: 1. Пользователи 2. Лидер совета

информации пользователя охватывает такие вещи, как имя пользователя, пароль, номер игры- играет и верхние 5 баллов пользователя. У меня в настоящее время есть схема, настроенная для этого, и она работает безупречно.

Теперь меня попросили добавить LeaderBoard, который должен показать 10 лучших результатов для всех пользователей. Я хотел бы создать отдельную запись для этого в той же базе данных, чтобы избежать проверки всех записей пользователей и фильтрации для отображения таблицы лидеров. Я бы предпочел просто ограничить коллекцию лидеров до 10 записей, и каждый раз, когда пользователь завершает игру, проверяйте их счет против этой коллекции, чтобы увидеть, должны ли они находиться на лидирующей доске. Я новичок в mongo/mongoose и не знаю, как наилучшим образом подойти к этому.

Любые советы будут оценены.

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

ответ

2

Для этого вам не нужна другая коллекция. Вы можете сделать это с запросом в MongoDB.

Предположим, я вставил следующее:

db.user.insert({ name: 'foo', scores: [100, 80, 90, 60, 65] }); 
db.user.insert({ name: 'bar', scores: [95, 120, 83, 70, 42] }); 
db.user.insert({ name: 'baz', scores: [180, 160, 95, 100, 77] }); 

Теперь, чтобы получить, скажем, 10 лучших игр из этой коллекции, вы должны сделать следующее:

db.user.aggregate([ 
    { $project: { name: 1, scores: 1 } }, 
    { $unwind: "$scores" }, 
    { $sort: { scores: -1, name: 1 } }, 
    { $limit: 10 } 
]) 

Просто Помните, aggregate является функцией от Mongo 2.2+. Убедитесь, что у вас это есть. Для получения дополнительной информации, проверьте official documentation.

+0

Gustav, Благодарим за отзыв! Разве это не становится хитом производительности, если я доберусь до точки, где я говорю, 3000 пользователей, все из которых сохранены 5 баллов? Кроме того, при любом раунде игры несколько одновременных пользователей могут получить доступ к одной и той же функциональности - это игра-викторина - пользователи удаляются из игры, когда им не хватает трех вопросов ... Кажется, что это может нести необязательно большая нагрузка на сервер. –

+0

Да, это, вероятно, было бы; во всяком случае, вы всегда будете держать верхний X в таблице лидеров, не так ли? Если это так, было бы неплохо сделать коллекцию 'leaderboard' как [закрытой] (http://docs.mongodb.org/manual/core/capped-collections/) :) – gustavohenke

+1

Еще раз спасибо за направление. Это похоже на решение, которое необходимо, однако исходный отклик действительно работал очень хорошо. –

Смежные вопросы