Вопрос о том, как получить случайный документ из коллекции, задавался много раз, и были предложения по этой теме.
Мне нужно собрать несколько случайных документов из коллекции и что еще хуже - эти документы должны соответствовать определенным критериям (отфильтрованные, я имею в виду). Например, у меня есть сборник статей, в которых каждая статья имеет поле "тема". Пользователь выбирает интересующую вас тему, и мой db должен показывать соответствующие статьи каждый раз в случайном порядке.
Очевидно, что ранее обсуждавшиеся хаки не помогут мне. Единственный способ добиться того, что я хочу, - это запросить только соответствующую тему:
var arr = db.articles.find({topic: 3}, {_id:1}).toArray();
а затем генерировать случайную последовательность чисел в зависимости от того, сколько документов было получено, а затем получить идентификаторы документов из массива с использованием случайных чисел в качестве индексов этого массива и затем, наконец, сделать еще один запрос к mongodb для получения документов с теми случайно выбранными идентификаторами.
Как вы можете видеть, это кажется немного слишком медленным, особенно, если слишком много статей возвращено первым запросом :)
Поэтому я думаю, что может быть какая-то команда mongodb для получения документов по индексным ключам на основе их позиции в индексе. Дело в том, что я могу создать закрытый составной индекс следующим образом:
db.articles.ensureIndex({topic: 1, _id:1});
И теперь мой запрос должен был бы отсканировать непрерывную строку правых _ids в индексе. И если бы я мог запросить документы из коллекции этими позициями "_ids", тогда я мог бы сделать все в одном запросе! Что-то вроде:
var cursor = db.articles.find({topic:3, $indexKeyPosition: {$in: myRandomSequence}});
Кто-нибудь знает о таких функциях?