Тема: MongoDB
Показать сообщение отдельно
Старый 21.06.2013, 14:35   #9
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: MongoDB

Кешировать такие данные, будет в разы эфективнее, нежели запрашивать их каждый раз.
Чтобы получить их, тебе нужно посчитать число записей, у которых значение выше того что ты запрашиваешь. Например у тебя есть 5 записей, со значением фрагов: 2, 5, 7, 9, 15. Тебе нужно найти на каком месте находиться игрок с 9 фрагами:
db.players.find({ frags: { $gte} }).count() 
Получишь число, которое является позицией с верху относительно всех записей игроков в бд. Если нужен процент от топа, тут всё просто
(total position) / total 
Индекс по полю которому ищешь - очень улучшит ситуацию.
Но count это всё равно O(n) операция, следственно если ты запрашиваешь из 10к игроков кого-то с серидины, то бд нужно пролистать 5к игроков, чтобы их посчитать.. Даже с индексом, это всё равно относительно долго.

Следственно имей отдельную collection позиций, и там всё очень тупо:
_id, timestamp, frags
Где _id будет такой же как и _id в collection самих player, timestamp - когда запись была обновлена в последний раз и frags - будет уже высчитанная позиция.
И если запрашиваются данные о позиции, грузи их, если их нету или они устарели (я бы раз в день обновлял), то обнови, и выдай.
Если же тебе нужны эти данные не по запросу а всегда, то тебе нужен cron job, что будет это делать периодически.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (10.07.2013)