无法访问mongoDb外部查询返回的结果

时间:2015-06-09 12:17:12

标签: node.js mongodb express

我使用express和mongoDb处理node.js。 我正在尝试从数据库“local”和集合“borrower”中检索数据并将其推送到空数组collectionOne。它在视图页面上呈现此数组。 我想在此输出中使用数组b_ids中的_id来调用同一路由器下的company_details集合。 我在这里遇到的问题是,在调用b_ids集合时尝试访问它时,我在数组company_details中没有获得任何值。

代码如下:

var collectionOne = [];
var collectionTwo = [];
var b_ids = [];

router.get('/fetch',function(req, res, next){
 MongoClient.connect('mongodb://localhost:27017/local', function(err, db){
    var collection = db.collection('borrower');

    db.collection("borrower", function(err, collection) {
        collection.find().toArray(function(err, result) {
                                            if (err) {
                                              throw err;
                                            } else {
                                                //console.log(result[0].first_name);
                                              for (i=0; i<result.length; i++) {
                                                collectionOne[i] = result[i];
                                                b_ids[i] = result[i]._id;
                                              }
                                            }
                                    });

        db.collection("company_details", function(err, collection){
            console.log(b_ids);
            collection.find({borrower_id : {$in :b_ids}}).toArray(function(err, result){
                if (err) {
                  throw err;
                } else {
                  for (i=0; i<result.length; i++) {
                    collectionTwo[i] = result[i];
                  }
                }
            });
        });
        res.render('index',{data : collectionOne , data1 : collectionTwo});
    }); 
 });
});

请建议我如何在此处访问b_ids数组。在此先感谢:)

2 个答案:

答案 0 :(得分:3)

来自toArray的回调是异步的,即在console.log行执行后会发生,因此您需要按如下方式重新安排:

var collectionOne = [];
router.get('/fetch',function(req, res, next){
  MongoClient.connect('mongodb://localhost:27017/local', function(err, db){
    var collection = db.collection('borrower');

    db.collection("borrower", function(err, collection) {
        collection.find().toArray(function(err, result) {
            if (err) {
                throw err;
            } else {
                for (i=0; i<result.length; i++) {
                    collectionOne[i] = result[i];
                    b_ids[i] = result[i]._id;
                }

                db.collection("company_details", function(err, collection){
                console.log(b_ids);
                collection.find({borrower_id : {$in :b_ids}}).toArray(function(err, result){
                    if (err) {
                        throw err;
                    } else {
                        for (i=0; i<result.length; i++) {
                            collectionTwo[i] = result[i];
                        }
                        res.render('index',{data : collectionOne , data1 : collectionTwo});
                    }
                });
            });
        }
    });
 });
});

这可确保在您尝试记录/呈现回调之前完成回调。

答案 1 :(得分:0)

创建一个带有回调函数作为参数的函数很简单

function returnBids(collection, callback){
   collection.find().toArray(function(err, result) {
      if (err) 
            throw err;
         else 
          callback(result)
     })
  }

,您可以通过调用函数returnbids()来在外部访问结果。即

returnBids(collection,function(b_ids){
    console.log(b_ids)
})