Современные выпуски 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 МБ. Это действительно довольно высокий заказ.
Общая концепция массовых методов - «меньше трафика», в результате отправки сразу нескольких вещей и обработки только одного ответа сервера. Сокращение этих накладных расходов, связанных с каждым запросом на обновление, экономит много времени.