2014-08-27 93 views
0

我使用的貓鼬與Express.js查詢貓鼬:與DATAS的陣列,並返回單個陣列

我有2個類別:

一)收集的模式

  • 用戶id
  • carId

ii)Collection B Schema

  • carId
  • carName

在集合的,我會存儲用戶多少輛車有 例如:如果用戶XYZ,有2輛車,我將創建2個文件,每一個獨特的車ID

當一個REST get方法被調用時,我想用userID,carID和carName返回。

但是,我有問題查詢多個集合並將它們合併爲一個結果!

我現在的方法行不通,由於代碼的異步:

var totalCar = [] 
CollectionA.find({ 
    userId: userId 
}, function(err, data){ 
    /*Wrong code here, how to fix it????? 
    for(var i = 0; i < data.length; i++){ 
     CollectionB.find({ 
     }, function(err, car){ 
      totalCar.push(car.carName) 
     }) 
    }*/ 

    res.json({ 
     userId: userId, 
     car: totalCar 
    }) 
}) 

如何從另一個集合查詢,查詢內部,同時從另一個集合合併這些查詢到一個結果,併發送給用戶?

回答

0

對於您的特殊問題,您可以在mongodb中使用「$ in」查詢。

var totalCar = []; 
CollectionA.find({ 
    userId: userId 
}, function(err, data){ 
    var cardIds = []; 
    for(var i = 0; i < data.length; i++){ 
     cardIds.push(data[i].cardId); 
    } 
    CollectionB.find({$in:cardIds}, function(err, cards) { 
     for (var i = 0; i < cards.length; i++) 
      totalCar.push(cards[i].carName); 
     res.json({ 
      userId: userId, 
      car: totalCar 
     }); 
    }); 
}); 

但在一般情況下,如果你正在尋找一種方式,在同步模式下執行的代碼,你可以看看這個模塊:https://github.com/caolan/async

+0

的感謝!只是爲了與您覈對,是不是使用$ in將在同步模式下查詢?你的意思是在異步模式下進行查詢>使用github中的模塊? – Tim 2014-09-05 02:32:24

+0

mongodb的回調總是異步的。通過使用「異步」模塊,它可以幫助您使代碼看起來像同步。 – Comtaler 2014-09-09 16:56:11

0

對於使用貓鼬:

CollectionA.find({ 
    userId: userId 
}, function(err, data){ 
    var carIds = []; 

    for(var i=0; i < data.length; i++){ 
      carIds[i] = data[i].carId; 
    } 

    CollectionB.find() 
     .where('carId')  
     .in(cardIds) 
     .exec(function(err, carModel){ 
       ... //get all the carModel in array 
})