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

65次阅读
没有评论

共计 1724 个字符,预计需要花费 5 分钟才能阅读完成。

自动写代码机器人,免费开通

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

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

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

一、populate

populate 是使用外键关联子表

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

var orderSchema = new mongoose.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 失效
})

用户表:

var userSchema = new mongoose.Schema({
 phone: String,
 status: String,
 createdAt: Date,
 updatedAt: Date
})

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

order.find().populate({path:  uid , model: User, select:  _id real_name phone bankcard}).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:  product 1 ,  instock  : 120 }
{  _id  : 2,  sku  :  def , description:  product 2 ,  instock  : 80 }
{  _id  : 3,  sku  :  ijk , description:  product 3 ,  instock  : 60 }
{  _id  : 4,  sku  :  jkl , description:  product 4 ,  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 如何实现同库联表查询方法”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计1724字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)