Utilizzo di bulkWrite
L'API per eseguire gli aggiornamenti lo gestisce meglio
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);
}
Se hai a che fare con array più grandi, ad esempio> 1000, prendi in considerazione l'invio delle scritture al server in batch di 500, il che ti offre prestazioni migliori poiché non invii tutte le richieste al server, solo una volta ogni 500 richieste.
Per le operazioni in blocco MongoDB impone un limite interno predefinito di 1000 operazioni per batch e quindi la scelta di 500 documenti è buona, nel senso che si ha un certo controllo sulla dimensione del batch piuttosto che lasciare che MongoDB imponga l'impostazione predefinita, cioè per operazioni più grandi nella grandezza di> 1000 documenti. Quindi per il caso precedente nel primo approccio si potrebbe semplicemente scrivere tutto l'array in una volta poiché questo è piccolo ma la scelta 500 è per array più grandi.
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
}
}