Korzystanie z bulkWrite
API do przeprowadzania aktualizacji radzi sobie z tym lepiej
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);
}
Jeśli masz do czynienia z większymi tablicami, tj.> 1000, rozważ wysyłanie zapisów do serwera w partiach po 500, co zapewnia lepszą wydajność, ponieważ nie wysyłasz każdego żądania do serwera, tylko raz na 500 żądań.
W przypadku operacji zbiorczych MongoDB nakłada domyślny limit wewnętrzny 1000 operacji na partię, a więc wybór 500 dokumentów jest dobry w tym sensie, że masz pewną kontrolę nad rozmiarem partii, zamiast pozwolić MongoDB narzucić domyślne, tj. W przypadku większych operacji o wielkości> 1000 dokumentów. Tak więc w powyższym przypadku w pierwszym podejściu można po prostu zapisać całą tablicę naraz, ponieważ jest to mała, ale wybór 500 dotyczy większych tablic.
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
}
}