2016-05-22 10 views
5

का उपयोग करके थोक सम्मिलन में वर्तमान में मोंगोब में "संग्रह 1" का संग्रह है। मेरे पास निम्नलिखित ऑब्जेक्ट्स हैं जिन्हें मोंगोडीबी में डालने की आवश्यकता है। मैं Mongoose एपीआई का उपयोग कर रहा हूँ। अभी के लिए, मैं सरणी के माध्यम से पुनरावृत्त कर रहा हूं और उनमें से प्रत्येक को मोंगो में डाल रहा हूं। यह अभी ठीक है, लेकिन डेटा बहुत बड़ा होने पर एक समस्या होगी। मुझे पुनरावृत्ति के बिना MongoDB में थोक में डेटा डालने का एक तरीका चाहिए। मुझे यकीन नहीं है कि यह कैसे करें। मुझे मोंगोस में थोक विकल्प नहीं मिला।मोंगो डीबी में मोंगोज़

नीचे

myData = [Obj1,Obj2,Obj3.......] 

myData.forEach(function(ele){ 
     //console.log(ele) 
    saveToMongo(ele); 
    }); 
function saveToMongo(obj){ 
    (new Collection1(obj)).save(function (err, response) { 
      if (err) { 
      // console.log('Error while inserting: ' + obj.name + " " +err); 
      } else { 
      // console.log('Data successfully inserted'); 
      } 
     }); 

     return Collection1(obj); 
    } 

उत्तर

0

मेरे कोड आप वस्तुओं की एक सरणी पारित कर सकते हैं मॉडल समारोह

var Collection1 = mongoose.model('Collection1'); 

Collection1.create(myData,function(err){ 
    if(err) ... 
}); 
16

आप यहाँ insertMany() विधि का उपयोग करने के लिए आप उपयोग कर रहे हैं चाहते हो सकता है बनाने के लिए नेवला नवीनतम मोंगोस संस्करण 4.4.X और अधिक, जो अनिवार्य रूप से Model.collection.insertMany() हुड के तहत उपयोग करता है और ड्राइवर समानांतर संभाल सकता है आपके लिए >= 1000 दस्तावेज़ों को आकार देना।

Collection1.insertMany(myData) 
    .then(function(docs) { 
     // do something with docs 
    }) 
    .catch(function(err) { 
     // error handling here 
    }); 

यह, दस्तावेजों का एक समूह बनाकर काम करता है समानांतर में उन पर .validate() कहता है, और फिर कॉल से निपटने के बेहतर त्रुटि के लिए

myData = [Obj1, Obj2, Obj3.......]; 
Collection1.insertMany(myData, function(error, docs) {}); 

या का उपयोग करते हुए वादे अंतर्निहित चालक की insertMany() के परिणाम पर प्रत्येक दस्तावेज़ के toObject({ virtuals: false });। हालांकि insertMany() प्री-सेव हुक ट्रिगर नहीं करता है, इसमें बेहतर प्रदर्शन होता है क्योंकि यह प्रत्येक दस्तावेज़ के लिए केवल 1 के बजाय सर्वर के लिए 1 राउंड-ट्रिप बनाता है।


नेवला संस्करणों ~3.8.8, ~3.8.22, 4.x जो समर्थन MongoDB सर्वर >=2.6.x, आप Bulk API रूप

var bulk = Collection1.collection.initializeOrderedBulkOp(), 
    counter = 0; 

myData.forEach(function(doc) { 
    bulk.insert(doc); 

    counter++; 
    if (counter % 500 == 0) { 
     bulk.execute(function(err, r) { 
      // do something with the result 
      bulk = Collection1.collection.initializeOrderedBulkOp(); 
      counter = 0; 
     }); 
    } 
}); 

// Catch any docs in the queue under or over the 500's 
if (counter > 0) { 
    bulk.execute(function(err,result) { 
     // do something with the result here 
    }); 
} 
+0

हाय इस प्रकार इस्तेमाल कर सकते हैं के लिए, मैं 'bulk' नेवला साथ डेटा की बहुत जोड़ने के लिए अपने तरीके से कोशिश कर रहा हूँ (मेरे पास जोड़ने के लिए 40 9 584 डेटा है) लेकिन मेरे पास अभी 273001 डेटा जोड़ा गया है। तुम जानते हो क्यों ? – John

+0

आपका मोंगोडीबी सर्वर संस्करण क्या है? – chridam

+0

मेरे पास मोंगोडीबी बनाम 3.2.9 और मोंगोस 4.7.2 है। अगर मैं insertMany का उपयोग करता हूं तो मुझे 'FATAL ERROR मिला: CALL_AND_RETRY_LAST आवंटन विफल - जावास्क्रिप्ट ढीला स्मृति से बाहर है तो मैं थोक विधि का उपयोग करने का प्रयास करता हूं। – John

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