Я придумал решение, которое включает в себя счетчик, подобный этому.Он не зависит от вызова count () и не ожидает ожидания.Он закроет БД после того, как все документы в каждом () будут исчерпаны.
var mydb = {}; // initialize the helper object.
mydb.cnt = {}; // init counter to permit multiple db objects.
mydb.open = function(db) // call open to inc the counter.
{
if( !mydb.cnt[db.tag] ) mydb.cnt[db.tag] = 1;
else mydb.cnt[db.tag]++;
};
mydb.close = function(db) // close the db when the cnt reaches 0.
{
mydb.cnt[db.tag]--;
if ( mydb.cnt[db.tag] <= 0 ) {
delete mydb.cnt[db.tag];
return db.close();
}
return null;
};
Чтобы каждый раз, когда вы собираетесь делать вызовы типа db.each () или db.save (), вы использовали эти методы, чтобы убедиться, что БД готова во время работы и закрыта, когда закончите.
Пример из OP:
foo = db.collection('foo');
mydb.open(db); // *** Add here to init the counter.**
foo.find({},function(err,cursor)
{
if( err ) throw err;
cursor.each(function (err, doc)
{
if( err ) throw err;
if (doc != null) {
doc.newkey = 'foo';
mydb.open(db); // *** Add here to prevent from closing prematurely **
foo.save(doc, function(err,count) {
if( err ) throw err;
mydb.close(db); // *** Add here to close when done. **
});
} else {
mydb.close(db); // *** Close like this instead. **
}
});
});
Теперь предполагается, что обратный вызов от второго до каждого из них проходит через mydb.open () до того, как последний обратный вызов от каждого переходит к mydb.close () .... так что, конечно, дайте мне знать, если это проблема.
Итак: поместите mydb.open (db) перед вызовом db и поставьте mydb.close (db)в точке возврата обратного вызова или после вызова db (в зависимости от типа вызова).
Мне кажется, что этот тип счетчика должен поддерживаться в объекте db, но это мой текущий обходной путь.Возможно, мы могли бы создать новый объект, который принимает в конструктор дб и оборачивать функции mongodb для лучшей обработки закрытия.