Aqui está uma solução potencial baseada na abordagem de contagem (não a testei e não há captura de erros, mas deve transmitir a ideia).
A estratégia básica é:Adquira a contagem de quantos registros precisam ser atualizados, salve cada registro de forma assíncrona e um retorno de chamada em caso de sucesso, que diminuirá a contagem e fechará o BD se a contagem chegar a 0 (quando a última atualização terminar). Usando
{safe:true}
podemos garantir que cada atualização seja bem-sucedida. O servidor mongo usará um thread por conexão, portanto, é bom a) fechar conexões não utilizadas ou b) agrupar/reutilizá-las.
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);
}
});
})
});
});