Използване на bulkWriteкод>
API за извършване на актуализации се справя по-добре с това
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);
}
Ако имате работа с по-големи масиви, т.е.> 1000, тогава помислете за изпращане на записите до сървъра на партиди от 500, което ви осигурява по-добра производителност, тъй като не изпращате всяка заявка към сървъра, а само веднъж на всеки 500 заявки.
За групови операции MongoDB налага вътрешно ограничение по подразбиране от 1000 операции на партида, така че изборът от 500 документа е добър в смисъл, че имате известен контрол върху размера на партидата, вместо да позволите на MongoDB да наложи стойността по подразбиране, т.е. за по-големи операции с обем> 1000 документа. Така че за горния случай при първия подход човек може просто да запише целия масив наведнъж, тъй като това е малко, но изборът 500 е за по-големи масиви.
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
}
}