Подтвердить что ты не робот

Как получить обратный вызов для MongoDB collection.find()

Когда я запускаю collection.find() в MongoDB/Node/Express, я бы хотел получить обратный вызов, когда он закончит. Какой правильный синтаксис для этого?

 function (id,callback) {

    var o_id = new BSON.ObjectID(id);

    db.open(function(err,db){
      db.collection('users',function(err,collection){
        collection.find({'_id':o_id},function(err,results){  //What the correct callback synatax here?
          db.close();
          callback(results);
        }) //find
      }) //collection
    }); //open
  }
4b9b3361

Ответ 1

То, что правильный синтаксис обратного вызова, но что find обеспечивает обратный вызов, это Cursor, а не массив документов. Поэтому, если вы хотите, чтобы ваш обратный вызов предоставил результаты в виде массива документов, вызовите toArray на курсор, чтобы вернуть их:

collection.find({'_id':o_id}, function(err, cursor){
    cursor.toArray(callback);
    db.close();
});

Обратите внимание, что ваш обратный вызов функции все равно должен предоставить параметр err, чтобы вызывающий абонент знал, работал ли запрос или нет.

Обновление 2.x для драйверов

find теперь возвращает курсор, а не обеспечивает его посредством обратного вызова, поэтому типичное использование может быть упрощено:

collection.find({'_id': o_id}).toArray(function(err, results) {...});

Или в этом случае, когда ожидается один документ, проще использовать findOne:

collection.findOne({'_id': o_id}, function(err, result) {...});

Ответ 2

На основе ответа JohnnyHK я просто завернул свои вызовы в метод db.open(), и он сработал. Спасибо @JohnnyHK.

app.get('/answers', function (req, res){
     db.open(function(err,db){ // <------everything wrapped inside this function
         db.collection('answer', function(err, collection) {
             collection.find().toArray(function(err, items) {
                 console.log(items);
                 res.send(items);
             });
         });
     });
});

Надеюсь, что это полезно в качестве примера.