Я использую 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
})
})
Как я могу запросить из другой коллекции внутри запроса и объединить эти запросы из другой коллекции в один результат и отправить пользователю?
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
Для использования 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
})
Похожие вопросы
Новые вопросы
node.js
Node.js — это основанная на событиях, неблокирующая, асинхронная среда выполнения ввода-вывода, использующая движок Google V8 JavaScript и библиотеку libuv. Он используется для разработки приложений, которые интенсивно используют возможность запуска JavaScript как на стороне клиента, так и на стороне сервера и, следовательно, выигрывают от возможности повторного использования кода и отсутствия переключения контекста.