Как объединить две коллекции через одно имя столбца в Mongoose и получить данные? - PullRequest
0 голосов
/ 30 апреля 2019

Я хочу вывести цену, основываясь на том же имени столбца, что и имя маршрута от двух моделей. Как это сделать?

1-я модель: -

var routeSchema = mongoose.Schema({
route_name: String,
from_city: String,
to_city : String,
stoppage_point: String,
arrival_time:String,
distance: Number,
journey_date:Date,
approx_time: Number,
status: {
    type: Boolean,
    default:true,
},

 }); 
 var routeModel = module.exports = mongoose.model('routes', routeSchema,"routes");

метод модели, в котором я хочучтобы получить мои данные,

module.exports.get_route = function(from_city,to_city,journey_date){
return new Promise(function(resolve,reject){
    routeModel.find({'from_city':from_city,'to_city':to_city,'journey_date':journey_date,status:true},"_id route_name from_city to_city stoppage_point distance approx_time arrival_time journey_date", function(err,result){
        if(err){
            reject(Error(err));
        }
        resolve(result);
    });
})
};

2-я модель: -

var ticketPriceSchema = mongoose.Schema({
route_name: String,
from_city: String,
to_city : String,
price: Number,

});
var ticketPriceModel = module.exports = mongoose.model('ticket', ticketPriceSchema,"ticket");

из этих 2-х модельных схем. Я хочу вывести цену из 2-й модели также с помощью route_name, которое является одинаковым столбцом в обеих схемах..

в результате я хочу цену,

_id, route_name, from_city, to_city, stoppage_point, distance, approx_time, arrival_time, journey_date, price

1 Ответ

0 голосов
/ 30 апреля 2019

попробуйте использовать оператор поиска, как показано ниже

routeModel.aggregate()
                .match({ route_name: req.query.route_name })
                .lookup({ from: 'tickets', localField: "route_name", foreignField: 'route_name', as: 'ticket' })
.exec()
.then((route) => { console.log(route) })
.catch((err) => { console.log(err) });

localField - это совпадающее имя поля в routeModel, а foreignField - совпадающее имя поля в ticketPriceModel (при поиске совпадающие поля не обязательно должны иметь одно и то же имя поля). проверка поиск Официальный документ говорит:

Для каждого входного документа этап поиска $ добавляет новое поле массива, элементы - соответствующие документы из «объединенной» коллекции.

Простыми словами поиск возвращает массив соответствующего документа из коллекции билетов. lookup добавит в документ весь соответствующий документ из коллекции заявок в виде массива под именем поля 'ticket'.

Мне просто интересно, почему вы держите цену в другой схеме (коллекции). Я предполагаю, что информация о маршрутах всегда будет сопровождать поле цены везде, где это необходимо. Почему вы хотите сделать дополнительный шаг, чтобы извлечь поле цены из другой схемы (коллекции). Я не специалист по монго, но каждый, кто работает с nosql, скажет вам оставить оба поля в одной коллекции. Существуют различные способы, которыми вы можете смоделировать ваши данные nosql в зависимости от того, как будут выбираться связанные данные Я вижу только одно дополнительное поле 'price' в ticketPriceSchema.

...