Moderna versioner av pymongo (större än 3.x) omsluter bulkoperationer i ett konsekvent gränssnitt som nedgraderar där serverversionen inte stöder bulkoperationer. Detta är nu konsekvent i MongoDB officiellt stödda drivrutiner.
Så den föredragna metoden för kodning är att använda bulk_write()
istället, där du använder en UpdateOne
annan lämplig operation istället. Och nu är det naturligtvis att föredra att använda listorna med naturliga språk snarare än en specifik byggare
Den direkta översättningen av den gamla dokumentationen:
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 klassiska dokumenttransformeringsslingan:
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 returnerade resultatet är BulkWriteResult
som kommer att innehålla räknare för matchade och uppdaterade dokument samt det returnerade _id
värden för eventuella "upserts" som inträffar.
Det finns lite av en missuppfattning om storleken på bulkoperationsuppsättningen. Den faktiska begäran som skickas till servern kan inte överstiga 16 MB BSON-gränsen eftersom den gränsen även gäller för "begäran" som skickas till servern som också använder BSON-format.
Det styr dock inte storleken på begäran arrayen som du kan bygga, eftersom de faktiska operationerna bara kommer att skickas och bearbetas i batcher om 1000 ändå. Den enda verkliga begränsningen är att dessa 1000 driftinstruktioner i själva verket inte skapar ett BSON-dokument som är större än 16 MB. Vilket verkligen är en ganska hög ordning.
Det allmänna konceptet med bulkmetoder är "mindre trafik", som ett resultat av att många saker skickas på en gång och bara hanterar ett serversvar. Minskningen av den overhead som är kopplad till varje enskild uppdateringsbegäran sparar mycket tid.