2015-12-30 5 views
8

साथ MongoDB में कई रिकॉर्ड डालने के लिए मैं सोच रहा था निम्नलिखित Node.jsसही रास्ता Node.js

साथ MongoDB में थोक आवेषण करने के लिए (हालांकि किसी भी अन्य डेटाबेस हो सकता है)

मैं लिखा है सही तरीका क्या है एक उदाहरण के रूप में कोड, हालांकि मुझे लगता है कि इसे डीबी.क्लोज़() के रूप में फर्श किया गया है, सभी एसिंक्रोनस संग्रह से पहले चलाया जा सकता है। सम्मिलित कॉल पूर्ण हो गए हैं।

MongoClient.connect('mongodb://127.0.0.1:27017/test', function (err, db) { 
    var i, collection; 
    if (err) { 
     throw err; 
    } 
    collection = db.collection('entries'); 
    for (i = 0; i < entries.length; i++) { 
     collection.insert(entries[i].entry); 
    } 
    db.close(); 
}); 

उत्तर

9

यदि आपका 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(); 
    }); 
}); 
+0

देखें यदि आप काउंटर% 1000 == 0' –

+0

आप डीबी को कैसे बंद करेंगे 'db.close();' if (counter% 1000! = 0) {...} के बाद 'स्टेटमेंट' को बाद में डीबी को बंद करने के लिए कथन ब्लॉक जोड़ना पड़ सकता है। – chridam

+1

क्या आप तब तक 'db.close()' को कॉल करने का जोखिम नहीं उठाते हैं, जबकि 'bulk.execute' कॉल अभी भी चल रहे हैं? –

5

आप insertMany का उपयोग कर सकते हैं। यह वस्तुओं की एक सरणी स्वीकार करता है। API देखें।

+1

कि ठीक है अगर आप सम्मिलित करना रिकॉर्ड की एक छोटी संख्या है, लेकिन आप कई हजारों पड़ा क्या है? –

+0

थोक ऑपरेशन में mongoDB (3.x) एकल समूह में 1000 दस्तावेज़ बैच लेता है और अधिक दस्तावेज़ों के लिए यह समूह बनाता है और इसे निष्पादित करता है। कृपया https://docs.mongodb.com/v3.2/reference/method/db.collection.insertMany/#execution-of-operations – HDB

0
var MongoClient = require('mongodb').MongoClient; 
var url = 'mongodb://localhost:27017/test'; 
var data1={ 
    name:'Data1', 
    work:'student', 
    No:4355453, 
    Date_of_birth:new Date(1996,10,17) 
}; 

var data2={ 
    name:'Data2', 
    work:'student', 
    No:4355453, 
    Date_of_birth:new Date(1996,10,17) 
}; 

MongoClient.connect(url, function(err, db) { 
    if(err!=null){ 
     return console.log(err.message) 
    } 

    //insertOne 
    db.collection("App").insertOne(data1,function (err,data) { 

     if(err!=null){ 
      return console.log(err); 
     } 
     console.log(data.ops[0]); 
    }); 

    //insertMany 

var Data=[data1,data2]; 

db.collection("App").insertMany(Data,forceServerObjectId=true,function (err,data) { 

     if(err!=null){ 
      return console.log(err); 
     } 
     console.log(data.ops); 
    }); 
    db.close(); 
}); 
+3

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, इस सवाल का जवाब देने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करना और/या कैसे यह दीर्घकालिक मूल्य में सुधार करता है। –

+0

यह कोड केवल कई रिकॉर्ड या एक रिकॉर्ड रिकॉर्ड डालने के लिए –

1

संस्करण 3.2 में नई।

db.collection.bulkWrite() विधि थोक सम्मिलित करने, अद्यतन करने और संचालन को हटाने की क्षमता प्रदान करता है। मोंगो डीबी के माध्यम से थोक सम्मिलन का भी समर्थन करता है।

bulkWrite में यह केवल insertOne, updateOne, updateMany, replaceOne, deleteOne, deleteMany

समर्थन कर रहा है अपने मामले कोड की एक पंक्ति का उपयोग कर डेटा को सम्मिलित करने के लिए, यह insertMany विकल्प का उपयोग कर सकते हैं।

MongoClient.connect('mongodb://127.0.0.1:27017/test', function (err, db) { 
 
      var i, collection; 
 
      if (err) { 
 
       throw err; 
 
      } 
 
      collection = db.collection('entries'); 
 
      collection.insertMany(entries) 
 
      db.close(); 
 
     });

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