2014-06-16 7 views
8

MongoDB documentation के अनुसार:मोंगोडीबी बैच ऑपरेशन अधिकतम आकार क्या है?

थोक ऑपरेशन आकार

एक थोक आपरेशन सबसे कम 1000 संचालन हो सकता है।

हालांकि, मैं बहुत बड़ा आपरेशन गिनती (300k के आसपास संचालन) के साथ थोक उपयोग करने के लिए नोड MongoDB देशी (collection.initializeUnorderedBulkOp() आदि)

इस सीमा पुरानी हो चुकी है साथ मोंगो 2.6 थोक संचालन एपीआई का उपयोग कर पा रहा था, या मैं बस कुछ याद कर रहा हूँ? क्या आप जानते हैं कि वास्तविक सीमा क्या है?

+0

अधिकतम आकार एक बीएसओएन दस्तावेज़ है जिसका वर्तमान सीमा 16 एमईजी पर निर्धारित है, इसी तरह बीएसओएन दस्तावेजों का उपयोग करके मोंगो डीबी संचार करता है। – Sammaye

उत्तर

13

मैंने मोंगोडीबी के जिरा में ticket खोला। उन्होंने जवाब दिया कि:

आप सही हैं; इस सीमा को दस्तावेज़ीकरण में कुछ स्पष्टीकरण की आवश्यकता है। सीमा सर्वर पर है, लेकिन क्लाइंट ड्राइवर कई बैचों में थोक संचालन को विभाजित करके एप्लिकेशन डेवलपर्स से सीमा छुपाते हैं।

+0

उसे नहीं पता था, धन्यवाद! – Sammaye

3

यह एक दिलचस्प बयान है, और यह 2.6 रिलीज के रूप में प्रलेखन के लिए नया है ताकि आप देखेंगे कि यह उस अनुभाग में मौजूद नहीं था जिसे आप पहले रिलीज़ के संदर्भ में संदर्भित करते हैं।

बेशक वास्तविक सीमा 16 एमबी बीएसओएन सीमा है, क्योंकि यह प्रभावी रूप से एक बीएसओएन दस्तावेज़ के रूप में तार पर भेजा जा सकता है। जब आप महसूस करते हैं कि यह "बल्क अपडेट्स" के लिए दिखाए गए अनुसार update के रनकॉमंड फॉर्म जैसे चीजों के शीर्ष पर एक अभिव्यक्ति API है, या अन्यथा सम्मिलित करता है जो स्पष्ट रूप से इस फ़ॉर्म को ले सकता है।

जिस तरह से मैं आमतौर पर इसे एक उदाहरण के रूप में लिखता हूं, थोक संचालन जोड़ते समय वर्तमान पुनरावृत्ति के मॉड्यूलू की जांच करेगा और हर बार केवल "निष्पादित" होगा। नोड ड्राइवर के लिए नहीं सटीक सिंटैक्स, लेकिन मूल रूप: तुम क्या कर रहे हैं पर निर्भर करता

var bulk = db.collection.initializeUnorderedBulkOp(); 
counter = 0; 

longArrayOrStream.forEach(function(doc) { 
    bulk.find({ "_id": doc._id }).update(
     { "$set": { "somefield": doc.somefield }}); 
    counter++; 

    if (counter % 500 == 0) { 
     bulk.execute(); 
     counter = 0; 
     bulk = db.collection.initializeUnorderedBulkOp(); 
    } 
}); 

if (counter > 0) 
    bulk.execute(); 

या कुछ इसी तरह की। तो यह आपके द्वारा उपयोग किए जा रहे वॉल्यूम से काफी कम होगा, लेकिन अनिवार्य रूप से प्रबंधनीय हिस्सों में जो नेटवर्क पर बहुत अधिक नहीं हैं और निश्चित रूप से 16 एमबी के तहत सुरक्षित रूप से सुरक्षित हैं।

तो बीएसओएन सीमा पूर्ण कठोर सीमा है, लेकिन व्यावहारिक कारणों से और यह भी मानते हुए कि आप त्रुटि स्थिति की जांच करना चाहेंगे जो आपको प्रतिक्रिया में एक बड़े दस्तावेज़ में भी प्राप्त होगा, आप शायद इन्हें रखना चाहते हैं छोटे टुकड़ों में।

यह एक समय में एक ऑपरेशन करने से बेहतर है, और मुझे नहीं पता कि मैं वास्तव में एक बार में तार पर 16 एमबी तक भेजना चाहता हूं और/या संभावित त्रुटियों के लिए 16 एमबी प्रतिक्रिया की जांच करना चाहता हूं।

संबंधित मुद्दे