首页 > 解决方案 > 如何通过猫鼬中的相同列名加入两个集合并派生数据?

问题描述

我想根据来自两个模型的 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 从第 2 个模型中得出价格,它是两个模式中的同一列。

结果我也想定价,

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

标签: node.jsjoinmongoosejoincolumn

解决方案


尝试使用如下查找运算符

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 阶段添加一个新的数组字段,其元素是“加入”集合中的匹配文档。

简单来说,查找从票证集合中返回匹配文档的数组。查找将在文档中添加来自票证集合的所有匹配文档作为字段名称“票证”下的数组。

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


推荐阅读