Pomocí bulkWrite
API pro provádění aktualizací to zvládá lépe
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);
}
Pokud máte co do činění s většími poli, tj.> 1000, zvažte odesílání zápisů na server v dávkách po 500, což vám poskytuje lepší výkon, protože na server neposíláte každý požadavek, ale pouze jednou za každých 500 požadavků.
Pro hromadné operace MongoDB zavádí výchozí interní limit 1000 operací na dávku, takže výběr 500 dokumentů je dobrý v tom smyslu, že máte určitou kontrolu nad velikostí dávky, než aby MongoDB uložil výchozí nastavení, tj. pro větší operace v rozsahu> 1000 dokumentů. Takže pro výše uvedený případ v prvním přístupu by bylo možné napsat celé pole najednou, protože toto je malé, ale volba 500 je pro větší pole.
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
}
}