mongo 联表查询方法

作者: 天驱丶 | 来源:发表于2017-08-13 02:36 被阅读1930次

这里只对同库联表查询做介绍,跨库联表查询可能在之后也会介绍(因为公司架构变动,之后可能会联表查询)
我用到的联表查询有两种,一种是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中填充外键

相关文章

  • mongo 联表查询方法

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

  • 单个数据库内分表

    分表当成其他表,便于理解。查询方法就用多表查询的方法就行。

  • Yii1.1 createCommand 命令

    热身训练: 常用语句: 使用表前缀: where的用法: 查询方法一: 查询方法二: https://blog.c...

  • MongoDB - 查询

    主要是说明mongodb的数据查询方法,本次不使用mongo shell来操作,使用图形化操作软件Robo来执行m...

  • 常用方法

    A alias 联表查询方式 一、table() 二、联表查询(内联、左联、右联、全联)的语法 表1结构--- ...

  • hibernate笔记-常用查询方法

    介绍hibernate常用查询方法 用到的表 查询department所有内容 hibernate可以将查询结果自...

  • java mongo使用

    开启mongo服务 链接mongo 查看所有的库 选择库 查看所有的表 查看表的所有数据 创建MongoDB 创建...

  • 微信小程序 微擎 方法集合

    1.查询方法:pdo_getall(表名, 条件, 字段, 键名,字段排序, 条数) 2.地址访问:http://...

  • jupyter-mongo

    使用mongo 进去 使用那些db,collection 创建新表 复制新表复制的时候很慢 注意事项! jupyt...

  • CentOS 7.6安装mongo服务器

    mongo是一种json格式存储数据的服务器,和mysql比较mongo字段可以在写入时定义,不用定义固定的表的字...

网友评论

    本文标题:mongo 联表查询方法

    本文链接:https://www.haomeiwen.com/subject/uejsrxtx.html