ЭТОТ ВОПРОС НЕ ПРЕДОСТАВЛЯЕТ ОТВЕТА! ОСТАНОВИТЬ ЗАКРЫТИЕ! Firestore: Как получить случайные документы в коллекции
Если бы было только два идентификатора fff...ffe
и fff...fff
, то первый выбирался бы практически каждый раз, даже в этом порядке убывания.
Исходное сообщение:
У меня есть коллекция пользователей, где идентификаторы генерируются с Python 's uuid.uuid4()
. Я хотел бы выбрать случайный идентификатор из коллекции. Огромный бонус, если его можно безопасно и «идеально равномерно» собрать, как secrets.choice()
, но в этом нет необходимости.
Ниже приведен код, который я в основном использую сейчас. Он работает достаточно хорошо, когда в базе данных много документов.
from uuid import uuid4
from google.cloud import firestore_v1 as firestore
client = firestore.Client()
def get_random_user_id():
"""Try to find a random user id."""
search_id = str(uuid4())
print('searhing from: {}'.format(search_id))
query = client.collection('users').where(
firestore.field_path.FieldPath.document_id(),
'>=',
client.document('users/' + search_id)
).limit(1)
docs = query.stream()
for doc in docs:
return doc.id
# Maybe there aren't that many documents, just get the first document
docs = client.collection('users').limit(1).stream()
for doc in docs:
return doc.id
# No documents found
return False
print(get_random_user_id())
Но, как вы можете себе представить, если документов не так много, или документы имеют идентификаторы, которые почти расположены рядом друг с другом шансы на то, что их выберут, весьма различны.
Позвольте привести крайний пример. Если бы было только два идентификатора fff ... ffe и fff ... fff, первый из них выбирался бы практически каждый раз.
Итак, существует ли правильный способ равномерного выбора случайных документов без ведения списка все документы или какой-то другой хакерский обходной путь?