Mongoose:使用数据数组进行查询并返回单个数组

时间:2014-08-27 14:40:39

标签: node.js mongodb express mongoose

我正在使用Mongoose和Express.js

我有两个系列:

i)收集架构

  • 用户id
  • carId

ii)收集B架构

  • carId
  • carName

在集合A中,我将存储用户拥有的汽车数量 示例:如果用户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
    })
})

如何从查询中的其他集合进行查询,并将来自其他集合的查询合并为单个结果并发送给用户?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用Mongoose:

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
})