Ecco una potenziale soluzione basata sull'approccio di conteggio (non l'ho testato e non c'è traccia degli errori, ma dovrebbe trasmettere l'idea).
La strategia di base è:acquisire il conteggio di quanti record devono essere aggiornati, salvare ogni record in modo asincrono e un callback in caso di esito positivo, che diminuirà il conteggio e chiuderà il DB se il conteggio arriva a 0 (al termine dell'ultimo aggiornamento). Utilizzando {safe:true}
possiamo garantire che ogni aggiornamento abbia successo.
Il server mongo utilizzerà un thread per connessione, quindi è bene a) chiudere le connessioni inutilizzate o b) raggrupparle/riutilizzarle.
db.open(function (err, db) {
db.collection('foo', function (err, collection) {
var cursor = collection.find({});
cursor.count(function(err,count)){
var savesPending = count;
if(count == 0){
db.close();
return;
}
var saveFinished = function(){
savesPending--;
if(savesPending == 0){
db.close();
}
}
cursor.each(function (err, doc) {
if (doc != null) {
doc.newkey = 'foo'; // Make some changes
db.save(doc, {safe:true}, saveFinished);
}
});
})
});
});