Nowoczesne wersje pymongo (większe niż 3.x) otaczają operacje zbiorcze w spójny interfejs, który obniża wersję tam, gdzie wersja serwera nie obsługuje operacji zbiorczych. Jest to teraz spójne w oficjalnie obsługiwanych sterownikach MongoDB.
Dlatego preferowaną metodą kodowania jest użycie bulk_write()
zamiast tego, gdzie używasz UpdateOne
zamiast tego inne odpowiednie działania operacyjne. A teraz oczywiście lepiej jest używać list języka naturalnego niż konkretnego kreatora
Bezpośrednie tłumaczenie starej dokumentacji:
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)
Lub klasyczna pętla transformacji 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)
Zwrócony wynik to BulkWriteResult
który będzie zawierał liczniki dopasowanych i zaktualizowanych dokumentów oraz zwrócony _id
wartości dla wszelkich występujących „przesunięć”.
Istnieje trochę błędnego przekonania co do rozmiaru tablicy operacji zbiorczych. Rzeczywiste żądanie wysłane do serwera nie może przekroczyć limitu 16 MB BSON, ponieważ limit ten dotyczy również „żądania” wysłanego do serwera, który również używa formatu BSON.
Nie ma to jednak wpływu na rozmiar tablicy żądań, którą można zbudować, ponieważ rzeczywiste operacje i tak będą wysyłane i przetwarzane tylko w partiach po 1000. Jedynym prawdziwym ograniczeniem jest to, że te 1000 instrukcji operacyjnych nie tworzy w rzeczywistości dokumentu BSON większego niż 16 MB. Co jest rzeczywiście dość wysokim zamówieniem.
Ogólną koncepcją metod masowych jest „mniejszy ruch”, w wyniku wysyłania wielu rzeczy naraz i zajmowania się tylko jedną odpowiedzią serwera. Zmniejszenie tego narzutu związanego z każdym żądaniem aktualizacji pozwala zaoszczędzić mnóstwo czasu.