Moderne udgivelser af pymongo (større end 3.x) ombryder masseoperationer i en ensartet grænseflade, der nedgraderer, hvor serverudgivelsen ikke understøtter masseoperationer. Dette er nu konsekvent i MongoDB officielt understøttede drivere.
Så den foretrukne metode til kodning er at bruge bulk_write()
i stedet, hvor du bruger en UpdateOne
anden anden passende operationshandling i stedet. Og nu foretrækkes det selvfølgelig at bruge de naturlige sproglister frem for en specifik builder
Den direkte oversættelse af den gamle dokumentation:
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)
Eller den klassiske dokumenttransformationsløkke:
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)
Det returnerede resultat er BulkWriteResult
som vil indeholde tællere for matchede og opdaterede dokumenter samt den returnerede _id
værdier for eventuelle "upserts", der forekommer.
Der er lidt en misforståelse om størrelsen af bulk operations-arrayet. Den faktiske anmodning, som sendes til serveren, må ikke overstige 16 MB BSON-grænsen, da denne grænse også gælder for den "anmodning", der sendes til serveren, som også bruger BSON-format.
Det bestemmer dog ikke størrelsen af det forespørgselsarray, som du kan bygge, da de faktiske operationer alligevel kun vil blive sendt og behandlet i batches på 1000. Den eneste reelle begrænsning er, at disse 1000 betjeningsinstruktioner i sig selv faktisk ikke opretter et BSON-dokument, der er større end 16MB. Hvilket faktisk er en ret høj ordre.
Det generelle koncept for bulk-metoder er "mindre trafik", som et resultat af at sende mange ting på én gang og kun handler om et serversvar. Reduktionen af den overhead, der er knyttet til hver enkelt opdateringsanmodning, sparer masser af tid.