MongoDB найти производительность случайного набора данных - PullRequest
1 голос
/ 24 февраля 2012

У меня есть коллекция с около 500000 наборов данных, и мне нравится находить случайный набор данных из нее.Я могу ограничить find () идентификатором клиента, который уменьшает размер примерно до 80000 наборов.Индексы также добавляются к идентификатору клиента.

В PHP я использую следующую команду для получения случайного набора данных:

 $mongoCursor = $mongoCollection->find($arrQuery, $arrFields)->skip(rand(1, $dataCount));

Теперь профилировщик сообщает:

 DB.Collection ntoskip:3224 nscanned:3326 nreturned:101 reslen:77979 262ms

Это займет довольно много времени, чтобы получить результат.Есть ли лучший способ получить данные?

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

Спасибо за любые мысли на эту тему.Dan

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

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

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

Если этот метод не работает для ваших данных и использования, вы также можете попробовать метод, рассмотренный здесь: http://cookbook.mongodb.org/patterns/random-attribute/

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

0 голосов
/ 27 июня 2012

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

Лучшим решением для меня было выбрать случайные числа, взять минимальное и максимальное значения и запросить базу данных, используя:1003 *

db.collection.find({...}).skip(min).limit(max-min);

Затем я просто повторил один раз для получения результата и сравнил индекс, начиная с i = min;я ++;и взять только тот элемент, который соответствует числу в случайном наборе.Для меня было нормальным ограничить область минимума и максимума случайным образом.Я использовал логарифмический подход, чтобы выбрать размер минимального окна в соответствии с размером моей коллекции.

Результат - это действительно быстрый способ выбора случайных наборов результатов.

Надеюсь, это кому-то тоже поможет.

--- Дан

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