Voici une solution potentielle basée sur l'approche de comptage (je ne l'ai pas testée et il n'y a pas de détection d'erreur, mais cela devrait transmettre l'idée).
La stratégie de base est :acquérir le nombre d'enregistrements à mettre à jour, enregistrer chaque enregistrement de manière asynchrone et un rappel en cas de succès, ce qui décrémentera le nombre et fermera la base de données si le nombre atteint 0 (lorsque la dernière mise à jour se termine). En utilisant {safe:true}
nous pouvons nous assurer que chaque mise à jour est réussie.
Le serveur mongo utilisera un thread par connexion, il est donc bon soit a) de fermer les connexions inutilisées, soit b) de les regrouper/réutiliser.
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);
}
});
})
});
});