Usando o
bulkWrite
API para realizar as atualizações lida com isso melhor 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 você estiver lidando com matrizes maiores, ou seja,> 1000, considere enviar as gravações para o servidor em lotes de 500, o que oferece um desempenho melhor, pois você não está enviando todas as solicitações ao servidor, apenas uma vez a cada 500 solicitações.
Para operações em massa, o MongoDB impõe um limite interno padrão de 1.000 operações por lote e, portanto, a escolha de 500 documentos é boa no sentido de que você tem algum controle sobre o tamanho do lote, em vez de deixar o MongoDB impor o padrão, ou seja, para operações maiores na magnitude de> 1.000 documentos. Portanto, para o caso acima, na primeira abordagem, pode-se escrever todo o array de uma só vez, pois isso é pequeno, mas a opção 500 é para arrays maiores.
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
}
}