2014-08-27 94 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 
})