Современные выпуски pymongo (выше 3.x) заключают массовые операции в согласованный интерфейс, который понижает версию там, где версия сервера не поддерживает массовые операции. Теперь это согласовано с официально поддерживаемыми драйверами MongoDB.
Поэтому предпочтительным методом кодирования является использование bulk_write()
вместо этого, где вы используете UpdateOne
другое другое соответствующее действие операции вместо этого. И теперь, конечно, предпочтительнее использовать списки на естественном языке, а не конкретный конструктор
Прямой перевод старой документации:
from pymongo import UpdateOne
operations = [
UpdateOne({ "field1": 1},{ "$push": { "vals": 1 } },upsert=True),
UpdateOne({ "field1": 1},{ "$push": { "vals": 2 } },upsert=True),
UpdateOne({ "field1": 1},{ "$push": { "vals": 3 } },upsert=True)
]
result = collection.bulk_write(operations)
Или классический цикл трансформации документа:
import random
from pymongo import UpdateOne
random.seed()
operations = []
for doc in collection.find():
# Set a random number on every document update
operations.append(
UpdateOne({ "_id": doc["_id"] },{ "$set": { "random": random.randint(0,10) } })
)
# Send once every 1000 in batch
if ( len(operations) == 1000 ):
collection.bulk_write(operations,ordered=False)
operations = []
if ( len(operations) > 0 ):
collection.bulk_write(operations,ordered=False)
Возвращаемый результат имеет вид BulkWriteResult
, который будет содержать счетчики совпадающих и обновленных документов, а также возвращаемые значения _id
для любых происходящих "upserts".
Существует некоторое неправильное представление о размере массива массовых операций. Фактический запрос, отправленный на сервер, не может превышать ограничение BSON в 16 МБ, поскольку это ограничение также применяется к «запросу», отправляемому на сервер, который также использует формат BSON.
Однако это не влияет на размер массива запросов, который вы можете создать, поскольку фактические операции в любом случае будут отправляться и обрабатываться только партиями по 1000. Единственное реальное ограничение состоит в том, что сами по себе эти 1000 рабочих инструкций фактически не создают документ BSON размером более 16 МБ. Что действительно является довольно высоким заказом.
Общая концепция массовых методов — «меньше трафика» в результате одновременной отправки многих вещей и обработки только одного ответа сервера. Сокращение накладных расходов, связанных с каждым отдельным запросом на обновление, экономит много времени.
person
Neil Lunn
schedule
25.03.2016