一、使用MongoDB聚合管道(Aggregation Pipeline)可以实现的功能

  • 1、使用聚合管道可以对集合中的文档进行变换和组合。
  • 2、实际项目:表关联查询、数据的统计。

二、聚合管道的使用方式

  • 1、使用方式

    db.collection_name[表名].aggregate([{}, {},....])
    
  • 2、使用的效果展示
    nodejs操作mongodb之六(聚合函数的使用)_前端开发

三、基本的命令集合

  • 1、mongodb aggregation管道操作符和表达式

    No 管道操作符 描素
    1 $project 增加、删除、重命名字段(查询的字段)
    2 $match 条件匹配查询,只有符和条件的数据才能查询出来
    3 $limit 限制结果的数量
    4 $skip 跳过文档的数量
    5 $sort 排序
    6 $group 根据条件分组
    7 $lookup 用来引入别的集合(多表查询)

    关于$lookup的几个参数介绍

    NO 字段 描素
    1 from 同一个数据库下等待被Join的集合
    2 localField 源集合中的match值,如果输入的集合中,某文档没有localField这个Key(Field),在处理的过程中,会默认为此文档含有 localField:null的键值对。
    3 foreignField Join的集合的match值,如果待Join的集合中,文档没有foreignField值,在处理的过程中,会默认为此文档含有 foreignField:null的键值对。
    4 as 为输出文档的新增值命名。如果输入的集合中已存在该值,则会覆盖掉
  • 2、mongodb中与mysql中的对比

    No mysql mongodb 描素
    1 where $match 查询条件
    2 group by $group 分组查询
    3 having $match 查询条件
    4 order by $sort 排序
    5 limit $limit 限制
    6 sum $sum 求和
    7 count $sum 计数
    8 join $lookup 表关联
    9 select $project 选择字段
  • 3、管道表达式

    • 管道操作符作为"键",所对应的“值”叫做管道表达式

    • {$match:{status:"A"}},$match 称为管道操作符,而 status:"A"称为管道表达式, 是管道操作符的操作数(Operand)

    • 常见的管道表达式操作符

      No 表达式操作符 描素
      1 $addToSet 将稳定指定字段的值去重
      2 $max 文档指定字段的最大值
      3 $min 文档指定字段的最小值
      4 $sum 文档指定字段求和
      5 $avg 文档指定字段求平均值
      6 $gt 大于给定的值
      7 $lt 小于给定的值
      8 $eq 等于给定的值
      9 gte 大于等于给定的值
      10 lte 小于等于给定的值

四、数据操作

  • 1、登录数据库并且创建数据库

    # 登录数据库
    mongo
    # 查看全部的数据库
    show dbs
    # 使用哪个数据库【如果当前没这个数据可以就是创建,之前有就是使用。如果是创建必须先插入一条数据使用show dbs才可以看到】
    use 数据库名
    # 查看当前使用的是哪个数据库
    db
    
  • 2、模拟数据插入到mongodb

    -- 订单
    db.order.insert({"order_id":"1","uid":10,"trade_no":"111","all_price":100,"all_num":2}) db.order.insert({"order_id":"2","uid":7,"trade_no":"222","all_price":90,"all_num":2}) db.order.insert({"order_id":"3","uid":9,"trade_no":"333","all_price":20,"all_num":6})
    -- 订单列表
    db.order_item.insert({"order_id":"1","title":"商品鼠标 1","price":50,num:1}) db.order_item.insert({"order_id":"1","title":"商品键盘 2","price":50,num:1}) db.order_item.insert({"order_id":"1","title":"商品键盘 3","price":0,num:1})
    db.order_item.insert({"order_id":"2","title":"牛奶","price":50,num:1}) db.order_item.insert({"order_id":"2","title":"酸奶","price":40,num:1})
    db.order_item.insert({"order_id":"3","title":"矿泉水","price":2,num:5}) db.order_item.insert({"order_id":"3","title":"毛巾","price":10,num:1})
    
  • 3、$project只查询出想要的字段

    -- db.order.aggregate([])
    db.getCollection('order').aggregate([
        {
            $project: {trade_no:1,all_price:1} -- 表示只查询出trade_no和all_price字段
        }
    ])
    
  • 4、$match过滤数据

    db.getCollection('order').aggregate([
        {
            $project: {trade_no:1,all_price:1}
        },
        {
      	  -- 对上面查询的结果进行过滤,只查询出价格大于等于90的
            $match: {all_price: {$gte: 90}}
        }
    ])
    
  • 5、$group分组查询

    db.order_item.aggregate([
        {
      		  -- 根据order_id字段来分组求和,求和字段是$num
                $group: {_id:  "$order_id", total: {$sum: "$num"}}
        }
    ])
    
  • 6、$sort排序

    db.order.aggregate([
        {
            $project: {order_id: 1, all_price: 1}
        },
        {
            $match: {all_price: {$gte: 90}}
        },
        {
      	 -- -1表示降序,1表示升序
            $sort: {all_price: -1}
        }
    ])
    
  • 7、$limit表示限制返回多少条

    db.order.aggregate([
        {
            $project: {order_id: 1, all_price: 1}
        },
        {
            $match: {all_price: {$gte: 90}}
        },
        {
            $sort: {all_price: -1}
        },
        {
            $limit: 1
        }
    ])
    
  • 8、$skip跳过多少条(从多少条数据开始)

    db.order.aggregate([
        {
            $project: {order_id: 1, all_price: 1}
        },
        {
            $match: {all_price: {$gte: 90}}
        },
        {
            $sort: {all_price: -1}
        },
        {
            $limit: 1
        },
        {
            $skip: 1
        }
    ])
    
  • 9、$lookup关联查询

    db.order.aggregate([
        {
            $lookup: {
                from: "order_item",
                localField: "order_id",
                foreignField: "order_id",
                as: "item"
            }
        }
    ])
    
    db.order.aggregate([
        {
            $match: {all_price: {$gte: 90}}
        },
        {
            $lookup: {
                from: "order_item",
                localField: "order_id",
                foreignField: "order_id",
                as: "item",
            }
        }
    ])
    
    db.order.aggregate([
        {
            $match: {all_price: {$gte: 90}}
        },
        {
            $lookup: {
                from: "order_item",
                localField: "order_id",
                foreignField: "order_id",
                as: "item",
            }
        },
        {
              -- 需要显示的字段
            $project: {"all_price": 1, "all_num": 1, "item.title": 1}    
        }
    ])