Съвременните версии на 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
стойности за всички възникнали "прекъсвания".
Има малко погрешно схващане за размера на масива от групови операции. Действителната заявка, изпратена до сървъра, не може да надвишава ограничението от 16MB BSON, тъй като това ограничение важи и за „заявката“, изпратена до сървъра, който също използва BSON формат.
Това обаче не регулира размера на масива от заявки, който можете да изградите, тъй като действителните операции така или иначе ще бъдат изпращани и обработвани само в партиди от 1000. Единственото реално ограничение е, че самите тези 1000 инструкции за работа всъщност не създават BSON документ, по-голям от 16MB. Което наистина е доста трудна задача.
Общата концепция за груповите методи е "по-малко трафик", в резултат на изпращане на много неща наведнъж и работа само с един отговор на сървъра. Намаляването на тези допълнителни разходи, свързани с всяка отделна заявка за актуализиране, спестява много време.