如何在猫鼬中通过相同的列名连接两个集合并派生数据?



我想根据从两个模型中route_name的相同列名得出价格。怎么办?

第一个模型 : -

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

第二型号 : -

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 模型模式中,我也想通过 route_name 从第二个模型中得出价格,这是两个模式中的同一列。

结果我也想定价,

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

尝试使用如下所示的查找运算符

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"下的数组。

我只是想知道你为什么要在不同的模式(集合)中保持价格。我猜路线信息将始终伴随着价格字段。为什么要多走一步从不同的架构(集合)中提取价格字段。我不是 mongo 方面的专家,但每个使用 nosql 的人都会告诉你将这两个字段保留在同一集合中。您可以通过不同的方式根据获取相关数据的方式对 nosql 数据进行建模。我在票证价格模式中只看到一个额外的字段"价格"。

最新更新