美文网首页
MongoDB联表查询

MongoDB联表查询

作者: 陈文瑜 | 来源:发表于2019-10-07 15:21 被阅读0次

创建表user、order

db.user.insertMany([
    {
        _id: ObjectId("5af2b2c6b138c267e414c072"),
        uid: "uid000",
        name: "小红",
        age: 26
    },
    {
        _id: ObjectId("5af2b2c6b138c267e414c073"),
        uid: "uid001",
        name: "小芳",
        age: 27
    }
]);

db.order.insertMany([
    {
        _id: ObjectId("4af2b2c6b138c267e414c071"),
        uid: "uid000",
        product: "产品1",
        money: 100
    },
    {
        _id: ObjectId("4af2b2c6b138c267e414c072"),
        uid: "uid000",
        product: "产品2",
        money: 200
    },
    {
        _id: ObjectId("4af2b2c6b138c267e414c073"),
        uid: "uid001",
        product: "产品1",
        money: 100
    },
    {
        _id: ObjectId("4af2b2c6b138c267e414c074"),
        uid: "uid001",
        product: "产品2",
        money: 200
    }
]);

查询

  • 联表查询
db.user.aggregate([{
$lookup: { // 左连接
  from: "order", // 关联到order表
  localField: "uid", // user 表关联的字段
  foreignField: "uid", // order 表关联的字段
  as: "orders"
}
}]);

返回结果:
// 1 
{
  "_id": ObjectId("5af2b2c6b138c267e414c072"),
  "uid": "uid000",
  "name": "小红",
  "age": 26,
  "orders": [
      {
          "_id": ObjectId("4af2b2c6b138c267e414c071"),
          "uid": "uid000",
          "product": "产品1",
          "money": 100
      },
      {
          "_id": ObjectId("4af2b2c6b138c267e414c072"),
          "uid": "uid000",
          "product": "产品2",
          "money": 200
      }
  ]
}

// 2
{
  "_id": ObjectId("5af2b2c6b138c267e414c073"),
  "uid": "uid001",
  "name": "小芳",
  "age": 27,
  "orders": [
      {
          "_id": ObjectId("4af2b2c6b138c267e414c073"),
          "uid": "uid001",
          "product": "产品1",
          "money": 100
      },
      {
          "_id": ObjectId("4af2b2c6b138c267e414c074"),
          "uid": "uid001",
          "product": "产品2",
          "money": 200
      }
  ]
}

  • 拆分orders
db.user.aggregate([{
$lookup: { // 左连接
  from: "order", // 关联到order表
  localField: "uid", // user 表关联的字段
  foreignField: "uid", // order 表关联的字段
  as: "orders"
}
},
{
$unwind: { // 拆分子数组
  path: "$orders",
  preserveNullAndEmptyArrays: true // 空的数组也拆分
}
}
]);

返回结果:
// 1
{
  "_id": ObjectId("5af2b2c6b138c267e414c072"),
  "uid": "uid000",
  "name": "小红",
  "age": 26,
  "orders": {
      "_id": ObjectId("4af2b2c6b138c267e414c071"),
      "uid": "uid000",
      "product": "产品1",
      "money": 100
  }
}

// 2
{
  "_id": ObjectId("5af2b2c6b138c267e414c072"),
  "uid": "uid000",
  "name": "小红",
  "age": 26,
  "orders": {
      "_id": ObjectId("4af2b2c6b138c267e414c072"),
      "uid": "uid000",
      "product": "产品2",
      "money": 200
  }
}

// 3
{
  "_id": ObjectId("5af2b2c6b138c267e414c073"),
  "uid": "uid001",
  "name": "小芳",
  "age": 27,
  "orders": {
      "_id": ObjectId("4af2b2c6b138c267e414c073"),
      "uid": "uid001",
      "product": "产品1",
      "money": 100
  }
}

// 4
{
  "_id": ObjectId("5af2b2c6b138c267e414c073"),
  "uid": "uid001",
  "name": "小芳",
  "age": 27,
  "orders": {
      "_id": ObjectId("4af2b2c6b138c267e414c074"),
      "uid": "uid001",
      "product": "产品2",
      "money": 200
  }
}
  • 分组求和并返回字段数据
db.user.aggregate([{
$lookup: { // 左连接
  from: "order", // 关联到order表
  localField: "uid", // user 表关联的字段
  foreignField: "uid", // order 表关联的字段
  as: "orders"
}
}, {
$unwind: { // 拆分子数组
  path: "$orders",
  preserveNullAndEmptyArrays: true // 空的数组也拆分
}
}, { // 分组求和并返回
$group: { // 分组查询
  _id: "$_id",
  name: { $first: "$name" },
  age: { $first: "$age" },
  money: {$sum: "$orders.money"}
}
}]);

返回结果:
// 1
{
  "_id": ObjectId("5af2b2c6b138c267e414c073"),
  "name": "小芳",
  "age": 27,
  "money": 300
}

// 2
{
  "_id": ObjectId("5af2b2c6b138c267e414c072"),
  "name": "小红",
  "age": 26,
  "money": 300
}

  • 查询用户的订单信息(订单id、产品、价格、用户名)
db.order.aggregate([{
$lookup: {
  from: "user",
  localField: "openid",
  foreignField: "openid",
  as: "u"
}
}, {
$unwind: "$u"
}, {
$addFields: {  name: "$u.name" }
}, {
$project: {
  _id: 1,
  product: 1,
  money: 1,
  name: 1
}
}]);

返回结果:
// 1
{
  "_id": ObjectId("4af2b2c6b138c267e414c071"),
  "product": "产品1",
  "money": 100,
  "name": "小红"
}

// 2
{
  "_id": ObjectId("4af2b2c6b138c267e414c071"),
  "product": "产品1",
  "money": 100,
  "name": "小芳"
}

// 3
{
  "_id": ObjectId("4af2b2c6b138c267e414c072"),
  "product": "产品2",
  "money": 200,
  "name": "小红"
}

// 4
{
  "_id": ObjectId("4af2b2c6b138c267e414c072"),
  "product": "产品2",
  "money": 200,
  "name": "小芳"
}

// 5
{
  "_id": ObjectId("4af2b2c6b138c267e414c073"),
  "product": "产品1",
  "money": 100,
  "name": "小红"
}

// 6
{
  "_id": ObjectId("4af2b2c6b138c267e414c073"),
  "product": "产品1",
  "money": 100,
  "name": "小芳"
}

// 7
{
  "_id": ObjectId("4af2b2c6b138c267e414c074"),
  "product": "产品2",
  "money": 200,
  "name": "小红"
}

// 8
{
  "_id": ObjectId("4af2b2c6b138c267e414c074"),
  "product": "产品2",
  "money": 200,
  "name": "小芳"
}

相关文章

  • MongoDB联表查询

    创建表user、order 查询 联表查询 拆分orders 分组求和并返回字段数据 查询用户的订单信息(订单id...

  • 常用方法

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

  • mongo 联表查询方法

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

  • MongoDB 安装&启动 mac版

    业务场景:MySQL联表查询效率较低Redis数据持久化功能不完善的考虑∴将数据库迁移至MongoDB集群Mac ...

  • MongoDB基础语法

    MongoDB为非关系型数据库,无法联表查询,但可以通过shell代码实现 工具:Robo 3T 以下为常用的语法...

  • 联表查询

  • mysql查询、事物(四)

    知识要点: 单表查询 子查询 联表查询 事务 在进行查询之前,我们要先建好关系表,并往数据表中插入些数据。为查询操...

  • mysql表关系

    mysql数据库 知识要点: 单表查询 子查询 联表查询 事务 在进行查询之前,我们要先建好关系表,并往数据表中插...

  • Python学习笔记二十(MySQL、SQL、联表查询)

    联表查询(多表查询) 连接查询 inner join 数据的交集 left join 数据的交集 并上 左边表的特...

  • Mongo连表聚合查询(1)

    在使用MongoDB存储数据的时候,我们查询的时候,有时候难免会需要进行连表查询。但是MongoDB本身是非关系性...

网友评论

      本文标题:MongoDB联表查询

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