nodejs操作mongodb之六(聚合函数的使用)

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

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

二、聚合管道的使用方式

  • 1、使用方式

    db.collection_name[表名].aggregate([{}, {},....])
    
  • 2、使用的效果展示
    在这里插入图片描述

三、基本的命令集合

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

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

    关于$lookup的几个参数介绍

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

    Nomysqlmongodb描素
    1where$match查询条件
    2group by$group分组查询
    3having$match查询条件
    4order by$sort排序
    5limit$limit限制
    6sum$sum求和
    7count$sum计数
    8join$lookup表关联
    9select$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等于给定的值
      9gte大于等于给定的值
      10lte小于等于给定的值

四、数据操作

  • 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}    
        }
    ])
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水痕01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值