मान लें कि आपके पास वस्तुओं की एक सरणी थी जिसे आप अपने संग्रह में मिलान आईडी पर अपडेट करना चाहते थे जैसे
var soldItems = [
{
"_id": 1,
"value": 4
},
{
"_id": 2,
"value": 27
}
];
तब आप <का उपयोग कर सकते हैं कोड>प्रत्येक के लिए () इसे पुनरावृत्त करने और अपने संग्रह को अपडेट करने के लिए सरणी पर विधि:
soldItems.forEach(function(item)){
Model.update({"_id": item._id}, {"$set": {"value": item.value }}, callback);
});
या वादों को
. के रूप में उपयोग करेंvar updates = [];
soldItems.forEach(function(item)){
var updatePromise = Model.update({"_id": item._id}, {"$set": {"value": item.value }});
updates.push(updatePromise);
});
Promise.all(updates).then(function(results){
console.log(results);
});
var updates = soldItems.map(function(item)){
return Model.update({"_id": item._id}, {"$set": {"value": item.value }});
});
Promise.all(updates).then(function(results){
console.log(results);
});
बड़े सरणियों के लिए, आप बेहतर प्रदर्शन के लिए बल्क राइट एपीआई का उपयोग करने का लाभ उठा सकते हैं। नेवला संस्करणों के लिए >=4.3.0
जो MongoDB सर्वर 3.2.x
. का समर्थन करते हैं ,आप उपयोग कर सकते हैं कोड>बल्कराइट ()
अपडेट के लिए। निम्न उदाहरण दिखाता है कि आप इस बारे में कैसे जा सकते हैं:
var bulkUpdateCallback = function(err, r){
console.log(r.matchedCount);
console.log(r.modifiedCount);
}
// Initialise the bulk operations array
var bulkOps = soldItems.map(function (item) {
return {
"updateOne": {
"filter": { "_id": item._id } ,
"update": { "$set": { "value": item.value } }
}
}
});
// Get the underlying collection via the native node.js driver collection object
Model.collection.bulkWrite(bulkOps, { "ordered": true, w: 1 }, bulkUpdateCallback);
नेवला संस्करणों के लिए ~3.8.8, ~3.8.22, 4.x
जो MongoDB सर्वर का समर्थन करते हैं >=2.6.x
, आप बल्क API
का उपयोग कर सकते हैं
इस प्रकार है
var bulk = Model.collection.initializeOrderedBulkOp(),
counter = 0;
soldItems.forEach(function(item) {
bulk.find({ "_id": item._id }).updateOne({
"$set": { "value": item.value }
});
counter++;
if (counter % 500 == 0) {
bulk.execute(function(err, r) {
// do something with the result
bulk = Model.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
});
}