これがカウントアプローチに基づく潜在的な解決策です(私はそれをテストしておらず、エラートラップはありませんが、アイデアを伝える必要があります)。
基本的な戦略は次のとおりです。更新する必要のあるレコード数のカウントを取得し、各レコードを非同期で保存し、成功時にコールバックします。これにより、カウントがデクリメントされ、カウントが0に達した場合(最後の更新が終了したとき)にDBが閉じられます。 {safe:true}
を使用する 各更新が成功することを保証できます。
mongoサーバーは接続ごとに1つのスレッドを使用するため、a)未使用の接続を閉じるか、b)それらをプール/再利用することをお勧めします。
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);
}
});
})
});
});