Använda bulkWrite
API för att utföra uppdateringarna hanterar detta bättre
mongodb.connect(mongo_url, function(err, db) {
if(err) console.log(err)
else {
var mongo_products_collection = db.collection("products")
mongoUpsert(mongo_products_collection, data_products, function() {
db.close()
})
}
})
function mongoUpsert(collection, data_array, cb) {
var bulkUpdateOps = data_array.map(function(data) {
return {
"updateOne": {
"filter": {
"product_id": data.product_id,
"post_modified": { "$ne": data.post_modified }
},
"update": { "$set": data },
"upsert": true
}
};
});
collection.bulkWrite(bulkUpdateOps, function(err, r) {
// do something with result
});
return cb(false);
}
Om du har att göra med större arrayer, dvs> 1000, överväg att skicka skrivningarna till servern i omgångar om 500, vilket ger dig bättre prestanda eftersom du inte skickar varje begäran till servern, bara en gång av 500 förfrågningar.
För bulkoperationer inför MongoDB en intern standardgräns av 1000 operationer per batch och så valet av 500 dokument är bra i den meningen att du har viss kontroll över batchstorleken snarare än att låta MongoDB införa standarden, det vill säga för större operationer i storleksordningen> 1000 dokument. Så för ovanstående fall i det första tillvägagångssättet skulle man bara kunna skriva hela arrayen på en gång eftersom den är liten men 500-valet är för större arrayer.
var ops = [],
counter = 0;
data_array.forEach(function(data) {
ops.push({
"updateOne": {
"filter": {
"product_id": data.product_id,
"post_modified": { "$ne": data.post_modified }
},
"update": { "$set": data },
"upsert": true
}
});
counter++;
if (counter % 500 == 0) {
collection.bulkWrite(ops, function(err, r) {
// do something with result
});
ops = [];
}
})
if (counter % 500 != 0) {
collection.bulkWrite(ops, function(err, r) {
// do something with result
}
}