यदि आपका MongoDB सर्वर 2.6 या नए है, यह बेहतर होगा एक लिखने का उपयोग करने का लाभ लेने के लिए आदेश Bulk API कि थोक डालने आपरेशन के निष्पादन जो केवल सर्वर के शीर्ष यह आसान बनाने के लिए पर कपोल-कल्पना कर रहे हैं के लिए अनुमति थोक परिचालनों का निर्माण करने के लिए और इस प्रकार बड़े संग्रहों पर आपके अपडेट के साथ परफॉर्मेंस लाभ प्राप्त होता है।
बैचों में थोक सम्मिलन संचालन भेजना सर्वर के लिए कम यातायात में परिणाम देता है और इस प्रकार व्यक्तिगत विवरणों में सब कुछ नहीं भेजकर कुशल वायर लेनदेन करता है, बल्कि सर्वर प्रतिबद्धता के लिए प्रबंधनीय हिस्सों में तोड़ देता है। इस दृष्टिकोण के साथ कॉलबैक में प्रतिक्रिया के लिए भी कम समय इंतजार कर रहा है।
इन थोक संचालन दो रूपों में मुख्य रूप से आते हैं:
- आदेश दिया थोक संचालन। ये ऑपरेशन ऑर्डर में सभी ऑपरेशन निष्पादित करते हैं और पहली लेखन त्रुटि पर त्रुटि देते हैं।
- अनॉर्डर्ड थोक संचालन। ये ऑपरेशन सभी परिचालनों को समानांतर में निष्पादित करते हैं और सभी त्रुटियों को जोड़ते हैं। अनियंत्रित थोक संचालन निष्पादन के आदेश की गारंटी नहीं देते हैं।
नोट, 2.6 से पुराने सर्वर के लिए एपीआई ऑपरेशन को कम कर देगा। हालांकि 100% डाउनवॉन्टर करना संभव नहीं है, इसलिए कुछ किनारे के मामले हो सकते हैं जहां यह सही संख्याओं की सही रिपोर्ट नहीं कर सकता है।
आपके मामले में, आप इस तरह 1000 के बैच में थोक एपीआई डालने आपरेशन को लागू कर सकते हैं:
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
var entries = [ ... ] // a huge array containing the entry objects
var createNewEntries = function(db, entries, callback) {
// Get the collection and bulk api artefacts
var collection = db.collection('entries'),
bulk = collection.initializeOrderedBulkOp(), // Initialize the Ordered Batch
counter = 0;
// Execute the forEach method, triggers for each entry in the array
entries.forEach(function(obj) {
bulk.insert(obj);
counter++;
if (counter % 1000 == 0) {
// Execute the operation
bulk.execute(function(err, result) {
// re-initialise batch operation
bulk = collection.initializeOrderedBulkOp();
callback();
});
}
});
if (counter % 1000 != 0){
bulk.execute(function(err, result) {
// do something with result
callback();
});
}
};
कॉल createNewEntries()
कार्य करते हैं।
MongoClient.connect(url, function(err, db) {
createNewEntries(db, entries, function() {
db.close();
});
});
देखें यदि आप काउंटर% 1000 == 0' –
आप डीबी को कैसे बंद करेंगे 'db.close();' if (counter% 1000! = 0) {...} के बाद 'स्टेटमेंट' को बाद में डीबी को बंद करने के लिए कथन ब्लॉक जोड़ना पड़ सकता है। – chridam
क्या आप तब तक 'db.close()' को कॉल करने का जोखिम नहीं उठाते हैं, जबकि 'bulk.execute' कॉल अभी भी चल रहे हैं? –