Как выполнить более 500 операций в Python для FireStore? - PullRequest
0 голосов
/ 25 декабря 2018

Я создаю документы из веб-скребков в python и загружаю их в Firestore.Для этого я добавляю их в словарь и выгружаю их из цикла for в python, один за другим (в идеале было бы лучше загрузить коллекцию сразу, но это не представляется возможным).Я хочу использовать партии, однако они имеют ограничение в 500 на одну партию, и мне нужно выполнить более 100 000 операций.Операции являются просто set() операциями и парой update(). Есть ли функция, чтобы узнать текущий размер пакета, чтобы я мог повторно инициализировать его?Как лучше всего использовать пакеты для более чем 500 операций в Python?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Лучший способ, который я нашел для работы с лимитом в 500 пакетов при работе с python, - это поместить все мои данные, которые я хочу отправить в Firestore, в словарь «Flat», чтобы я мог работать с каждым уникальным документом.Этот словарь имеет в качестве ключа для каждого документа форму: 'collection_document_collection_document ...', в то время как значением для этого ключа будет словарь с:

{'action': 'set', 'reference': reference, 'document': {}}

'action' может быть 'set', 'обновить или удалить, ключ «ссылка» является фактической ссылкой Firestore, а «документ» это просто документ.Например, это 2 документа в разных местах.

{
    'user_data_roger':
    {'action': 'set', 'reference': db.collection('user_data').document('roger'), 'document': {'name': 'Roger', 'age': 37}},
    'user_data_roger_works_april':
    {'action': 'update', 'reference': db.collection('user_data').document('roger').collection('works').document('april'), 'document': {'is_valid': True, 'in_progress': True, 'level':5}},
}

После обработки всех необходимых мне данных я хочу разделить словарь на массивы по 500 элементов, а затем добавить все эти элементы в пакет, используяклавиша 'action' для партии.

# Convert dictionary to a list
dictionary_list = []
for item in dictionary:
    dictionary_list.append(dictionary.get(item))
# Split List in lists containing 500 items per list
list_to_batch = [dictionary_list[item:item+500] for item in range(0, len(dictionary_list), 500)]
# Finally iterate through the 'list_to_batch' add each item to the batch and commit using a for loop
for item in list_to_batch:
    batch = db.batch()
    for document in item:
        if document['action'] == 'set':
            batch.set(document['reference'], document['value'])
        elif draw['action'] == 'update':
            batch.update(document['reference'], document['value'])
        else:
            batch.delete(document['reference'], document['value'])
    # Finally commit the batch
    batch.commit()

В моем конкретном случае после обработки всех необходимых мне данных у меня было более 700 000 операций, поэтому следите за выставлением счетов: -D

0 голосов
/ 25 декабря 2018

Максимальное количество операций в пакете составляет 500. Если вам нужно больше операций, вам потребуется несколько пакетов.

Нет API для определения текущего количества операций в пакете.Если вам это нужно, вам придется отслеживать это самостоятельно.

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