资讯专栏INFORMATION COLUMN

mongo同库联表查询

MageekChiu / 3254人阅读

摘要:源地址同库联表查询这里只对同库联表查询做介绍,跨库联表查询可能在之后也会介绍因为公司架构变动,之后可能会联表查询我用到的联表查询有两种,一种是的,一种是是使用外键关联子表例如现在有一张订单表结构动态外键用户订单类型订单的状态完成未完成失效用

源地址:mongo同库联表查询
这里只对同库联表查询做介绍,跨库联表查询可能在之后也会介绍(因为公司架构变动,之后可能会联表查询)
我用到的联表查询有两种,一种是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以上貌似可以转,没试过)

参考文章
Mongoose中的关联表查询 && 聚合查询
在mongoose中填充外键

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/19057.html

相关文章

  • TiDB 在摩拜单车的深度实践及应用

    摘要:本文会选择三个场景,给大家简单介绍一下在摩拜单车的使用姿势遇到的问题以及解决方案。图在线业务集群拓扑图四数据沙盒集群离线业务数据沙盒,属于离线业务集群,是摩拜单车的一个数据聚合集群。 作者介绍:吕磊,摩拜单车高级 DBA。 一、业务场景 摩拜单车 2017 年开始将 TiDB 尝试应用到实际业务当中,根据业务的不断发展,TiDB 版本快速迭代,我们将 TiDB 在摩拜单车的使用场景逐渐...

    Paul_King 评论0 收藏0
  • nodebb搭建,维护,discuz!数据迁移至mongo

    摘要:原文链接为什么选择了我也不知道官方中文论坛官方文档中文文档安装此处的方式是安装部署不用考虑环境配置问题,但是相应的也会有一些弊端比如文件的修改等变得麻烦下方为镜像的为了修改文件方便,加了一个文件夹方便和宿主机文件交换同步上传的 原文链接 为什么选择了NodeBB?我也不知道~~~ NodeBB官方Github NodeBB中文论坛 NodeBB官方文档 NodeBB中文文档 安装 此...

    Charlie_Jade 评论0 收藏0
  • 有关mysql联表的拆分

    摘要:有挫败感,故现在把联表的拆分写一篇文章。在最开始,先解释一年的联表查询的机制。现在又三张表基础信息扩展信息银行存款现在需要取出每个会员的基本信息,扩展信息以及银行存款。最好的办法就是对这个进行拆分。 今天有朋友问了我一个问题,说: 有四张表,他要从四张表里面取数据,他已经设计好了数据冗余等等,但还是需要通过联表查询来获取数据,问我有没有比较好的解决办法。说了挺长时间,朋友没听明白。有...

    evin2016 评论0 收藏0

发表评论

0条评论

MageekChiu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<