web-dev-qa-db-fra.com

Comment obtenir un rappel sur MongoDB collection.find ()

Lorsque j'exécute collection.find() dans MongoDB/Node/Express, j'aimerais recevoir un rappel une fois terminé. Quelle est la syntaxe correcte pour cela?

 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's the correct callback synatax here?
          db.close();
          callback(results);
        }) //find
      }) //collection
    }); //open
  }
44
John

C'est la syntaxe de rappel correcte, mais ce que find fournit au rappel est un Cursor , pas un tableau de documents. Donc, si vous souhaitez que votre rappel fournisse des résultats sous forme de tableau de documents, appelez toArray sur le curseur pour les renvoyer:

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

Notez que le rappel de votre fonction doit toujours fournir un paramètre err pour que l'appelant sache si la requête a fonctionné ou non.

2.x Mise à jour du pilote

find renvoie maintenant le curseur plutôt que de le fournir via un rappel, donc l'utilisation typique peut être simplifiée pour:

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

Ou dans ce cas où un seul document est attendu, il est plus simple à utiliser findOne :

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

Basé sur la réponse de JohnnyHK, j'ai simplement encapsulé mes appels dans la méthode db.open () et cela a fonctionné. Merci @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);
             });
         });
     });
});

J'espère que cela vous sera utile à titre d'exemple.

21
Anmol Saraf