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, я устанавливаю порядок по полю "позиция" и обновляю значение для него, много данных загрузки пользователя и данные всегда обновляются, и это будет случайное значение.