यह विस्फोट हो गया क्योंकि आप अगले पुनरावृत्ति पर जाने से पहले एक एसिंक्रोनस कॉल के पूरा होने की प्रतीक्षा नहीं कर रहे हैं। इसका मतलब यह है कि आप अनसुलझे कार्यों का "स्टैक" बना रहे हैं जब तक कि यह कोई समस्या न हो। इस साइट का नाम फिर से क्या है? चित्र प्राप्त करें?
इसलिए "बल्क"
के साथ आगे बढ़ने का यह सबसे अच्छा तरीका नहीं है सम्मिलन सौभाग्य से अंतर्निहित MongoDB ड्राइवर पहले ही इस बारे में सोच चुका है, पहले उल्लेखित कॉलबैक समस्या से अलग। वास्तव में एक "बल्क एपीआई"
है। इसे पूरी तरह से बेहतर बनाने के लिए उपलब्ध है। और यह मानते हुए कि आपने पहले ही मूल ड्राइवर को db
. के रूप में खींच लिया है वस्तु। लेकिन मैं केवल .collection
. का उपयोग करना पसंद करता हूं मॉडल से एक्सेसर, और "async"
सब कुछ स्पष्ट करने के लिए मॉड्यूल:
var bulk = Model.collection.initializeOrderedBulkOp();
var counter = 0;
async.whilst(
// Iterator condition
function() { return count < 1000000 },
// Do this in the iterator
function(callback) {
counter++;
var model = buildModel(counter);
bulk.insert(model);
if ( counter % 1000 == 0 ) {
bulk.execute(function(err,result) {
bulk = Model.collection.initializeOrderedBulkOp();
callback(err);
});
} else {
callback();
}
},
// When all is done
function(err) {
if ( counter % 1000 != 0 )
bulk.execute(function(err,result) {
console.log( "inserted some more" );
});
console.log( "I'm finished now" ;
}
);
पूरा होने पर दोनों "एसिंक्रोनस" कॉलबैक विधियों का उपयोग करने में अंतर है, बल्कि केवल एक स्टैक का निर्माण करना है, बल्कि "बल्क ऑपरेशंस एपीआई" को नियोजित करना है ताकि 1000 प्रविष्टियों के बैच अपडेट स्टेटमेंट में सब कुछ सबमिट करके एसिंक्रोनस राइट कॉल को कम किया जा सके।पी>
यह न केवल आपके स्वयं के उदाहरण कोड की तरह फ़ंक्शन निष्पादन का "एक स्टैक का निर्माण" करता है, बल्कि सभी को अलग-अलग बयानों में नहीं भेजकर कुशल "वायर" लेनदेन करता है, बल्कि सर्वर प्रतिबद्धता के लिए प्रबंधनीय "बैच" में तोड़ देता है ।