MongoDB: каков наиболее эффективный способ запроса одного случайного документа? - PullRequest
7 голосов
/ 09 ноября 2011

Мне нужно выбрать документ из коллекции случайным образом (альтернативно - небольшое количество последовательных документов из случайно расположенного «окна»).Я нашел два решения: 1 и 2 .Первое недопустимо, так как я ожидаю большой размер коллекции и хочу минимизировать размер документа.Второй кажется неэффективным (я не уверен насчет сложности операции skip).И здесь можно найти упоминание о запросе документа с указанным индексом, но я не знаю, как это сделать (я использую драйвер C ++).

Есть ли другие варианты решения проблемы?Какой самый эффективный?

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

Однажды у меня была похожая проблема.В моем случае в моих документах была указана дата.Я знал самую раннюю возможную дату в наборе данных, поэтому в своем коде приложения я сгенерировал бы случайную дату в диапазоне EARLIEST_DATE_IN_SET и NOW, а затем запросил mongodb с помощью запроса GTE для свойства date и просто ограничил бы его 1 результатом.

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

С индексом свойства date этобыл супер быстрый запрос.

2 голосов
/ 10 ноября 2011

Кажется, что вы могли бы сформировать решение 1 там (при условии, что ваш ключ _id был значением auto-inc), затем просто сделать подсчет ваших записей и использовать его в качестве верхнего предела для случайного int в c ++, затем возьмите этот ряд.

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

Если у вас нет поля auto-inc, Монго говорит о том, как быстро добавить его здесь:

Поле Auto Inc.

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