zoukankan      html  css  js  c++  java
  • 关系型数据库表(集合)与表(集合)之间的关系 聚合查询

    -

    关系型数据库表与表的几种关系

    1、一对一的关系

    例如:一个人对应一个身份证号,即为一对一的关系

    2、一对多的关系

    例如:1个班级对应多名学生,即为一对多的关系

    3、多对多的关系

    例如:一个学生可以选择多门课程、一门课程可以被多个学生选修,彼此的对应关系,即是多对多的关系。

     多对多的通常会建立一个中间表来存储多对多的关系

    聚合管道:

    aggregation

    db.order.aggregate([
        {$match:{state:"A"}},//匹配order表中state为A的数据
        {$group:{_id:"$cus_id",total:{$sum:"$amount"}}},//根据cus_id来分组,用每一组的amount来求和
    ])

     表的聚合管道主要用来做表的关联查询和数据统计

     聚合管道的常见操作符:

    $project  :  增加、删除、重命名字段

    $match : 条件匹配,只满足条件的文档才能进入下一阶段

    $limit : 限制结果的数量

    $skip : 跳过文档的数量

    $sort : 条件排序

    $group : 条件组合结果 统计

    $lookup : $lookup可以引入其他集合的数据  (表关联查询)

    order表中有这些数据

     order_item表中有这些数据

    一个订单对应多个商品

    $project   筛选列 控制显示列中的那些字段

    db.order.aggregate([
        {
            $project:{order_id:1,trade_no:1,all_price:1} //筛选出order_id、trade_no、all_price 这3个属性 1|true:显示  0|false:不显示
        }
    ])

    $match  用于过滤文档,用法类似于find方法的参数

    db.order.aggregate([
        {
            $project:{order_id:1,trade_no:1,all_price:1}
        },
        {
            $match:{"all_price":{$gte:90}} //筛选出all_price >= 90 的数据
        }
    ])

     $group 将集合中的文档进行分组,可用于统计结果

        统计每个订单的订单数量,按照订单分组

    db.order_item.aggregate([
        {
            $group:{_id:"$order_id",total:{$sum:"$num"}}  //以order_id进行分组 求出每组num属性的和
        }
    ])

     $sort 

    对集合中的文档进行排序

    db.order.aggregate([
        {
            $project:{order_id:1,trade_no:1,all_price:1}
        },
        {
            $match:{"all_price":{$gte:90}} 
        },
        {
            $sort:{"all_price":-1} //以all_price进行倒叙排序 1:正序 2:倒叙
        }
    ])

    $limit

    限制文档条数

    db.order.aggregate([
        {
            $project:{order_id:1,trade_no:1,all_price:1}
        },
        {
            $match:{"all_price":{$gte:90}} 
        },
        {
            $sort:{"all_price":-1} 
        },
        {
            $limit:1 //限制1条
        }
    ])

    $skip

    跳过几条

    db.order.aggregate([
        {
            $project:{order_id:1,trade_no:1,all_price:1}
        },
        {
            $match:{"all_price":{$gte:90}} 
        },
        {
            $sort:{"all_price":-1} 
        },
        {
            $limit:2 
        },
        {
            $skip:1 //跳过1条
        }
    ])

    $lookup

    表关联

    实现下面结果

    [
        {
            order_id:'',
            trade_no:'',
            items:[
                {title:'鼠标',price:20},
                {title:'键盘',price:20}
            ]
        }
    ]

    分析trade_no在order表内  剩余属性在order_item表内都有

    db.order.aggregate([
        {
            $lookup:{
                from:"order_item",//order要关联order_item表
                localField:"order_id",//要关联的字段  order表本身的 order_id 字段
                foreignField:"order_id",//要关联的字段 关联表的 order_id 字段
                as:"items" //把关联表的数据放到items中
            }
        }
    ])

    结果

    {
        "_id": ObjectId("612b399436239d3a8307cfdb"),
        "order_id": "1",
        "uid": 10,
        "trade_no": "111",
        "all_price": 100,
        "all_num": 2,
        "items": [{
            "_id": ObjectId("612b399436239d3a8307cfde"),
            "order_id": "1",
            "title": "商品鼠标1",
            "price": 50,
            "num": 1
        }, {
            "_id": ObjectId("612b399436239d3a8307cfdf"),
            "order_id": "1",
            "title": "商品键盘2",
            "price": 50,
            "num": 1
        }, {
            "_id": ObjectId("612b3deb36239d3a8307cfe2"),
            "order_id": "1",
            "title": "商品键盘3",
            "price": 0,
            "num": 1
        }]
    } {
        "_id": ObjectId("612b399436239d3a8307cfdc"),
        "order_id": "2",
        "uid": 7,
        "trade_no": "222",
        "all_price": 90,
        "all_num": 2,
        "items": [{
            "_id": ObjectId("612b399436239d3a8307cfe0"),
            "order_id": "2",
            "title": "牛奶",
            "price": 50,
            "num": 1
        }, {
            "_id": ObjectId("612b399736239d3a8307cfe1"),
            "order_id": "2",
            "title": "酸奶",
            "price": 40,
            "num": 1
        }]
    } {
        "_id": ObjectId("612b399436239d3a8307cfdd"),
        "order_id": "3",
        "uid": 9,
        "trade_no": "333",
        "all_price": 20,
        "all_num": 6,
        "items": [{
            "_id": ObjectId("612b3f1136239d3a8307cfe3"),
            "order_id": "3",
            "title": "矿泉水",
            "price": 2,
            "num": 1
        }, {
            "_id": ObjectId("612b3f1236239d3a8307cfe4"),
            "order_id": "3",
            "title": "毛巾",
            "price": 10,
            "num": 1
        }]
    }

    ==

    db.order.aggregate([
        {
            $lookup:{
                from:"order_item",
                localField:"order_id",
                foreignField:"order_id",
                as:"items"
            }
        },
        {
            $match:{"all_price":{$gte:90}} //order表内 筛选出all_price >= 90 的数据
        }
    ])

    精简一下数据

    db.order.aggregate([
        {
            $lookup:{
                from:"order_item",
                localField:"order_id",
                foreignField:"order_id",
                as:"items"
            }
        },
        {
            $match:{"all_price":{$gte:90}} 
        },
        {
            $project:{order_id:1,trade_no:1,items:1} //主表值显示这3个字段 记得要把items写进去
        }
    ])

     结果

    {
        "_id": ObjectId("612b399436239d3a8307cfdb"),
        "trade_no": "111",
        "items": [{
            "_id": ObjectId("612b399436239d3a8307cfde"),
            "order_id": "1",
            "title": "商品鼠标1",
            "price": 50,
            "num": 1
        }, {
            "_id": ObjectId("612b399436239d3a8307cfdf"),
            "order_id": "1",
            "title": "商品键盘2",
            "price": 50,
            "num": 1
        }, {
            "_id": ObjectId("612b3deb36239d3a8307cfe2"),
            "order_id": "1",
            "title": "商品键盘3",
            "price": 0,
            "num": 1
        }]
    } {
        "_id": ObjectId("612b399436239d3a8307cfdc"),
        "trade_no": "222",
        "items": [{
            "_id": ObjectId("612b399436239d3a8307cfe0"),
            "order_id": "2",
            "title": "牛奶",
            "price": 50,
            "num": 1
        }, {
            "_id": ObjectId("612b399736239d3a8307cfe1"),
            "order_id": "2",
            "title": "酸奶",
            "price": 40,
            "num": 1
        }]
    }

    -

  • 相关阅读:
    在excel实现多级联动
    发送邮件使用html模板的实现的大致思路
    设计模式的定义和分类
    yb课堂之用户登陆校验拦截器开发 《十一》
    CTF中常用的php伪协议利用
    Docker
    从零开始的Wordpress个人博客搭建
    .htaccess文件配置理解
    disable_function绕过--利用LD_PRELOAD
    信息安全实习生面试小结
  • 原文地址:https://www.cnblogs.com/fqh123/p/15202220.html
Copyright © 2011-2022 走看看