2017-05-22 58 views
0

我有個大問題。 我想遍歷集合的結果集和每個集合我想找到一個結果。Express JS MongoDB for each找到

這看起來是這樣的:

router.get('/', function(req, res) { 
    var floors = []; 
    var rooms = []; 

    req.db.collection('floors').find().sort({_id: 1}).forEach(function(floor) { 
     floors.push(floor); 
    }); 

    req.db.collection('rooms').find().sort({_id: 1}).forEach(function(room) { 
     req.db.collection('floors').findOne({_id: new ObjectID(room.floorId)}, function(error, floor) { 
      room.floor = floor; 
      rooms.push(room); 
     }); 
    }); 

    res.render('rooms', { floors: floors, rooms: rooms }); 
}); 

的問題是,之前迭代完成的頁面將被渲染。 我試圖使用異步和承諾,但我沒有得到它運行。

+1

它因爲res.render('房間...在回調之外,在兩者之間向上移動}); – FluffyNights

+0

這是行不通的,因爲然後渲染將被稱爲多次(對於每個' –

+0

你使用哪種mongo驅動程序? –

回答

0

基本上,您必須等到發送渲染結果之前完成所有查詢。不幸的是,你不使用承諾,所以這會有點混亂。

看來,您正在使用的原生客戶端,並根據文檔有第二個回調要注意的是這個請求會得到相當重的,當所有的迭代完成 http://mongodb.github.io/node-mongodb-native/2.2/api/Cursor.html#forEach

router.get('/', function(req, res, next) { 
    var floors = []; 
    var rooms = []; 

    function done(err){ 
    if(err) { 
     return next(err); 
    } 
    res.render('rooms', { floors: floors, rooms: rooms }); 
    } 

    function getRooms(err){ 
    if(err){ 
     return next(err); 
    } 
    req.db.collection('rooms').find().sort({_id: 1}).forEach(function(room) { 
     // you already have all the floors, no need to hit the db again 
     floors.find(floor => floor._id === room.floorId); // not sure about this 100% as _id could be an object 
    }, done); 
    } 

    req.db.collection('floors').find().sort({_id: 1}).forEach(function(floor) { 
    floors.push(floor); 
    }, getRooms); 

}); 

被調用當你的數據庫增長。