Как сделать Bulk Upwrite в Pymongo - PullRequest
0 голосов
/ 30 марта 2020

В настоящее время у меня есть этот код, который перебирает каждую строку в моей таблице сбора mongoDB и либо вставляет строку, либо обновляет строку новыми данными (в зависимости от того, есть ли сегодняшняя дата и studentID):

for rowindex, row in InsertionData.iterrows():
    record = row.to_dict()
    record['date'] = datetime.datetime.combine(datetime.date.today(), datetime.time(0, 0))
    collection.replace_one({'student': row.get('student'), 'date': record['date']}, record, upsert=True)

Тем не менее, мне было интересно, есть ли способ сделать массовую upsert?

Моя идея состоит в том, что он пропустит все записи, которые будут обновлены, создаст сценарий обновления и добавит его в массив операций. Затем, когда у него заканчиваются записи или он достигает 5000, он запускает функцию bulkWrite для Mon go, которая в основном отправляет один запрос на сервер mon go, а не 5000 отдельных запросов. Это сделало бы это намного быстрее, так как самое большое замедление - это связь между сервером, а не сама функция обновления.

Кто-нибудь знает, как это сделать в python / pymon go?

1 Ответ

1 голос
/ 30 марта 2020

Использовать Bulk Write Operations.

Создать список и добавлять каждое обновление как ReplaceOne, например,

operations = []
for rowindex, row in InsertionData.iterrows():
    record = row.to_dict()
    record['date'] = datetime.datetime.combine(datetime.date.today(), datetime.time(0, 0))
    operations.append(ReplaceOne({'student': row.get('student'), 'date': record['date']}, record, upsert=True))

collection.bulk_write(operations)
...