Я использую Mongoose с Express.js

У меня 2 коллекции:

I) Сбор схемы

  • Идентификатор пользователя
  • carId

Ii) Схема коллекции B

  • carId
  • carName

В коллекции A я сохраню, сколько машин у пользователя. Пример: если у пользователя XYZ 2 машины, я создам 2 документа, каждый с уникальным идентификатором автомобиля.

Когда вызывается метод получения REST, я хочу вернуться с идентификатором пользователя, идентификатором автомобиля и именем автомобиля.

Но у меня проблема с запросом нескольких коллекций и объединением их в один результат!

Мой текущий метод не работает из-за асинхронности кода:

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
Tim 27 Авг 2014 в 18:40

2 ответа

Лучший ответ

Для вашего конкретного вопроса вы можете использовать запрос «$ in» в mongodb.

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
Comtaler 3 Сен 2014 в 02:04
Благодарность! просто чтобы проверить с вами, разве использование $in не будет запрашивать в режиме синхронизации ??? ты имеешь в виду запрос в асинхронном режиме правильно > используя модуль с гитхаба?
 – 
Tim
5 Сен 2014 в 06:32
Обратный вызов mongodb всегда асинхронный. Используя модуль «async», он может помочь вам сделать ваш код похожим на синхронный.
 – 
Comtaler
9 Сен 2014 в 20:56

Для использования 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
})
0
Tim 5 Сен 2014 в 06:27