पाइमोंगो के आधुनिक रिलीज़ (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
. के काउंटर होंगे होने वाले किसी भी "अप्सर्ट्स" के लिए मान।
थोक संचालन सरणी के आकार के बारे में कुछ गलत धारणाएं हैं। सर्वर को भेजा गया वास्तविक अनुरोध 16 एमबी बीएसओएन सीमा से अधिक नहीं हो सकता क्योंकि यह सीमा सर्वर को भेजे गए "अनुरोध" पर भी लागू होती है जो बीएसओएन प्रारूप का भी उपयोग कर रहा है।
हालांकि यह अनुरोध सरणी के आकार को नियंत्रित नहीं करता है जिसे आप बना सकते हैं, क्योंकि वास्तविक संचालन केवल 1000 के बैचों में ही भेजा और संसाधित किया जाएगा। एकमात्र वास्तविक प्रतिबंध यह है कि वे 1000 ऑपरेशन निर्देश स्वयं वास्तव में 16 एमबी से अधिक बीएसओएन दस्तावेज़ नहीं बनाते हैं। जो वास्तव में काफी लंबा क्रम है।
एक साथ कई चीजें भेजने और केवल एक सर्वर प्रतिक्रिया से निपटने के परिणामस्वरूप बल्क विधियों की सामान्य अवधारणा "कम ट्रैफ़िक" है। हर एक अपडेट अनुरोध से जुड़े उस ओवरहेड को कम करने से बहुत समय की बचत होती है।