ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-06-15 16:04:46  阅读:247  来源: 互联网

标签:nodejs mongodb price db 之六 id item order match


一、使用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 字段 描素
    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}    
        }
    ])
    

标签:nodejs,mongodb,price,db,之六,id,item,order,match
来源: https://blog.51cto.com/u_3409716/2904268

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有