Moderní vydání pymongo (větší než 3.x) zabalují hromadné operace do konzistentního rozhraní, které přechází na nižší verzi tam, kde vydání serveru hromadné operace nepodporuje. To je nyní konzistentní v ovladačích oficiálně podporovaných MongoDB.
Preferovanou metodou kódování je tedy použití bulk_write()
místo toho, kde použijete UpdateOne
místo toho jinou vhodnou operaci. A nyní je samozřejmě upřednostňováno používat seznamy přirozeného jazyka spíše než konkrétní stavitel
Přímý překlad staré dokumentace:
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)
Nebo klasická smyčka transformace dokumentu:
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)
Vrácený výsledek je BulkWriteResult
který bude obsahovat čítače shodných a aktualizovaných dokumentů a také vrácené _id
hodnoty pro jakékoli "upserts", které se vyskytnou.
Existuje trochu mylná představa o velikosti pole hromadných operací. Skutečný požadavek odeslaný na server nemůže překročit limit 16 MB BSON, protože tento limit platí také pro „požadavek“ odeslaný na server, který také používá formát BSON.
To však neřídí velikost pole požadavků, které můžete sestavit, protože skutečné operace budou stejně odeslány a zpracovány pouze v dávkách po 1000. Jediným skutečným omezením je, že oněch 1000 operačních instrukcí samotných ve skutečnosti nevytvoří BSON dokument větší než 16 MB. Což je skutečně dost vysoký řád.
Obecnou koncepcí hromadných metod je „menší provoz“ v důsledku odesílání mnoha věcí najednou a pouze s jednou odpovědí serveru. Snížení této režie spojené s každou jednotlivou žádostí o aktualizaci šetří spoustu času.