意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

mongodb如何实现同库联表查询方法

来源:恒创科技 编辑:恒创科技编辑部
2023-12-02 15:17:59

这篇文章主要介绍mongodb如何实现同库联表查询方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

注意:这里只对同库联表查询做介绍,跨库联表查询可能在之后也会介绍(因为公司架构变动,之后可能会联表查询)

我用到的联表查询有两种,一种是mongoose的populate,一种是$lookup


mongodb如何实现同库联表查询方法

一、populate

populate是使用外键关联子表

例如现在有一张订单表结构(动态外键):

varorderSchema=newmongoose.Schema({
uid:{type:String,required:true},//用户id
amount:{type:Number,required:true},
oType:{type:Number,required:true},//订单类型
status:{type:Number,required:true},//订单的状态:1完成2未完成3失效
})

用户表:

varuserSchema=newmongoose.Schema({
phone:String,
status:String,
createdAt:Date,
updatedAt:Date
})

现在我想根据查询order表,并返回对应用户phone字段

order.find().populate({path:'uid',model:User,select:'_idreal_namephonebankcard'}).exec(function(err,order){
//order:{
//uid:{
//phone:'15626202254',
//status:"expand",
//createdAt:Date,
//updatedAt:Date
//},
//amount:5000,
//oType:2,//订单类型
//status:1,//订单的状态:1完成2未完成3失效
//}
});

这里order表的uid指向了user表的_id字段,当然也可以在新建表的时候定义外键,这里就不细说了

二、$lookup

lookup就是使用aggregate的$lookup属性,直接上官网例子非常好懂

orders表

{"_id":1,"item":"abc","price":12,"quantity":2}
{"_id":2,"item":"jkl","price":20,"quantity":1}
{"_id":3}

inventory表

{"_id":1,"sku":"abc",description:"product1","instock":120}
{"_id":2,"sku":"def",description:"product2","instock":80}
{"_id":3,"sku":"ijk",description:"product3","instock":60}
{"_id":4,"sku":"jkl",description:"product4","instock":70}
{"_id":5,"sku":null,description:"Incomplete"}
{"_id":6}
db.orders.aggregate([
{
$lookup:
{
from:"inventory",
localField:"item",
foreignField:"sku",
as:"inventory_docs"
}
}
])

就是使用order的item字段作为inventory表的查询条件{sku: item},并赋值给inventory_docs字段,但值得注意的是两个字段的类型必须一样(3.5以上貌似可以转,没试过)

以上是“mongodb如何实现同库联表查询方法”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注恒创行业资讯频道!

上一篇: mysql直接拷贝data目录下数据库源文件还原数据库方法 下一篇: JavaScript单线程和任务队列是什么