Firestore: как получить случайные документы в коллекции

для моего приложения важно иметь возможность выбирать несколько документов наугад из коллекции в firebase.

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

вот что я хотел бы сделать, рассмотрим следующую схему firestore:

root/
  posts/
     docA
     docB
     docC
     docD

тогда в моем клиенте (я нахожусь в быстрой среде) я хотел бы написать запрос, который может это сделать:

db.collection("posts")[0, 1, 3] // would return: docA, docB, docD

есть ли в любом случае я могу сделать что-то в этом роде? Или есть другой способ, которым я могу выбрать случайные документы аналогичным образом?

пожалуйста, помогите.

2 ответов


документ ID агностическая версия

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

это создаст индекс с вашими случайно отсортированными документами.

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

let postsRef = db.collection("posts")
queryRef = postsRef.whereField("random", isGreaterThan: random)
                   .order(by: "random")
                   .limit(to: 1)

проверьте, что это вернуло документ. Если это нет, измените направление и повторите попытку:

queryRef = postsRef.whereField("random", isLessThanOrEqualTo: random)
                   .order(by: "random", descending: true)
                   .limit(to: 1)

версия Auto Id

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

в этой системе создайте новый идентификатор auto id для использования в запросе. Теперь выберите документы (ограничение 1) в коллекции, которые больше, чем ваш новый идентификатор авто.

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

несколько случайных чисел

часто вы захотите выбрать более 1 случайного документа за раз. Существует 2 различных способа настройки вышеуказанных методов в зависимости от того, какие компромиссы вы хотите.

Промыть И Повторить

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

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

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

сюда

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

компромисс с этим решением заключается в повторяющихся последовательностей. В то время как документы упорядочены случайным образом, если вы когда-либо в конечном итоге перекрывающиеся диапазоны, вы увидите тот же шаблон ты видел раньше. Однако есть 2 способа смягчить эту озабоченность. Во-первых, вставленные документы будут в конечном итоге переплетены между собой, постепенно изменяя последовательность. Во-вторых, вы можете ускорить это, обновив


У меня есть один способ получить случайный документ списка в Firebase Firestore, это очень просто. Когда я загружаю данные в Firestore, я создаю имя поля "позиция" со случайным значением от 1 до 1 миллионов. Когда я получаю данные из Fire store, я устанавливаю порядок по полю "позиция" и обновляю значение для него, много данных загрузки пользователя и данные всегда обновляются, и это будет случайное значение.