Как найти номер строки в отсортированной коллекции MongoDB, чтобы вычислить ее процентиль? - PullRequest
4 голосов
/ 26 апреля 2011

У меня есть большая коллекция MongoDB, которая содержит идентификатор пользователя и счетчик, представляющий общее количество попаданий для этого пользователя за время. Я хотел бы иметь возможность рассчитать данный процентиль пользователей.

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

percentile = row_index / total_rows;

Как это будет сделано в MongoDB?

Ответы [ 2 ]

4 голосов
/ 04 июля 2011

Получить общее количество db.yourCollection.count()

Затем подсчитать запись с большим номером, используя
db.yourCollection.find({$gte: value}).count()

Если общее количество = 1000, считать больше или равно = 950, то вы попали в 950/1000 - верх 95%

Но если вы часто используете свою коллекцию в режиме чтения и редко в режиме записи, я бы предложил создать новую временную коллекцию, используя MapReduce, чтобы иметь записи {_id:..., percent:...}

2 голосов
/ 26 апреля 2011

Тривиальное решение здесь - сортировка по убыванию количества попаданий. Затем вы перемещаетесь по результатам, пока не найдете свой идентификатор пользователя.

Понятно, что это решение не обеспечивает высокой производительности, если вам приходится много запускать его. Легко получить «топ-20», но гораздо больше вычислений - «нижние 25%».

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

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

{ percent : 95, score : 888888 }
{ precent : 90, score : 777777 }
...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...