Как получить случайные документы, которые равномерно распределяются, из Cloud Firestore? - PullRequest
0 голосов
/ 16 апреля 2020

ЭТОТ ВОПРОС НЕ ПРЕДОСТАВЛЯЕТ ОТВЕТА! ОСТАНОВИТЬ ЗАКРЫТИЕ! 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, первый из них выбирался бы практически каждый раз.

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

1 Ответ

0 голосов
/ 16 апреля 2020

Как обсуждалось в комментариях к вопросу - спасибо @DougStevenson и @FrankvanPuffelen за разъяснения - лучший способ работы с большими коллекциями при выборе случайных документов - это поле с достаточной энтропией и равномерным распределением, а затем применение изложенных подходов в этом другом вопросе .

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

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