『MongoDB』MongoDB聚合框架深度解析及丰富的聚合查询案例

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 📣读完这篇文章里你能收获到- MongoDB聚合框架的概念知识- MongoDB的复杂聚合查询- MQL与SQL的对比- MQL聚合查询转换成相应语言的代码

请添加图片描述
📣读完这篇文章里你能收获到

  • MongoDB聚合框架的概念知识
  • MongoDB的复杂聚合查询
  • MQL与SQL的对比
  • MQL聚合查询转换成相应语言的代码

请添加图片描述

MongoDB的聚合查询是比较复杂,不过别急着自我劝退,记得看到最后有 彩蛋

请添加图片描述

一、什么是 MongoDB 聚合框架(Aggregation Framework)

  • MongoDB 聚合框架是一个计算框架,它可以:
  1. 作用在一个或几个集合上;
  2. 对集合中的数据进行的一系列运算;
  3. 将这些数据转化为期望的形式;
  • 从效果而言,聚合框架相当于 SQL 查询中的:
  1. GROUP BY
  2. LEFT OUTER JOIN
  3. AS等

请添加图片描述

二、聚合框架中的管道(Pipeline)和步骤(Stage)

  • 整个聚合运算过程称为管道(Pipeline),它是由多个步骤(Stage)组成的,每个管道:
  1. 接受一系列文档(原始数据);
  2. 每个步骤对这些文档进行一系列运算
  3. 结果文档输出给下一个步骤

在这里插入图片描述

请添加图片描述

三、聚合运算的基本格式

pipeline = [$stage1, $stagde2, ...$stageN];

db.<COLLECTION>.aggregate
  (  pipeline,
  {  options }
);

常见步骤

在这里插入图片描述
在这里插入图片描述

常见步骤中的运算符

在这里插入图片描述

请添加图片描述

四、MQL常用聚合查询与SQL对比

案例1—分页查询

  • SQL
SELECT
FIRST_NAME AS `名`,  LAST_NAME AS `姓`
FROM Users
WHERE GENDER = '男'
SKIP 100
LIMIT 20
  • MQL
db.users.aggregate([
  {$match: {gender: ’’男”}},
  {$skip: 100},
  {$limit: 20},
  {$project: {
    '名': '$first_name',
    '姓': '$last_name'
  }}
]);

案例2—GroupBy分组查询

  • SQL
SELECT DEPARTMENT,  COUNT(NULL) AS EMP_QTY
FROM Users
WHERE GENDER = '女'
GROUP BY DEPARTMENT HAVING
COUNT(*) < 10
  • MQL
db.users.aggregate([
  {$match: {gender: '女'}},
  {$group: {
    _id: '$DEPARTMENT’,
    emp_qty: {$sum: 1}
  }},
  {$match: {emp_qty: {$lt: 10}}}
]);

请添加图片描述

五、MQL特有的聚合查询

$unwind

> db.students.findOne()
{
  name:'张三',  
  score:[
    {subject:'语文',score:84},
    {subject:'数学',score:90},
    {subject:'外语',score:69}
  ]
}
> db.students.aggregate([{$unwind: '$score'}])
{name: '张三', score: {subject: '语文', score: 84}}
{name: '张三', score: {subject: '数学', score: 90}}
{name: '张三', score: {subject: '外语', score: 69}}

$bucket

在这里插入图片描述

db.products.aggregate([{
  $bucket:{
    groupBy: "$price",  boundaries: [0,10,20,30,40],  
    default: "Other",
    output:{"count":{$sum:1}}
  }
}])

$facet

在这里插入图片描述

db.products.aggregate([{
  $facet:{
    price:{
      $bucket:{…}
    },
    year:{
      $bucket:{…}
    }
  }
}])

请添加图片描述

六、聚合查询实验

数据准备

  • 这部分数据需要原始数据的私聊我拿

在这里插入图片描述

聚合实验一:计算总销量

  • 计算到目前为止的所有订单的总销售额
db.orders.aggregate([
  { $group:
    {
      _id: null,//_id为null,表示不进行分组
      total: { $sum: "$total" }
    }
  }
])
// 结果: // { "_id" : null, "total" : NumberDecimal("44019609") }

聚合实验二:订单金额按日期汇总

  • 查询2019年第一季度(1月1日~3月31日)已完成订单(completed)的订单总金额和订单总数
db.orders.aggregate([
  // 步骤一:匹配条件,相当于sql中的where
  { $match: { status: "completed", orderDate: {
    $gte: ISODate("2019-01-01"),//MongoDB中日期均需要通过ISODate进行转换
    $lt: ISODate("2019-04-01") } 
  } },
  // 步骤二:聚合订单总金额、总运费、总数量
  { $group: {
    _id: null,
    total: { $sum: "$total" },
    shippingFee: { $sum: "$shippingFee" },  
    count: { $sum: 1 }    
  } },
  // 步骤三:投影及汇总金额+运费
  { $project: {//$project相当sql中select x1 as s1 
    // 计算总金额
    grandTotal: { $add: ["$total", "$shippingFee"] },
    count: 1,//1表示显示,0则为不显示
    _id: 0 } }
])
// 结果:
// { "count" : 5875, "grandTotal" : NumberDecimal("2636376.00") }

请添加图片描述

七、彩蛋

  • 通过Mongo Compass来创建复杂的聚合计算管道

在这里插入图片描述

手把手教学

以上一章节的聚合实验二为例进行讲解:订单金额按日期汇总
  • 步骤一:匹配条件

筛选match stage,右边会跟据你的条件给你筛选出部分实时数据,随后进行下一个stage的输入,点击ADD STAGE

在这里插入图片描述

  • 步骤二:聚合订单总金额、总运费、总数量

在这里插入图片描述

  • 步骤三:投影及汇总金额+运费

在这里插入图片描述

保存 Pipeline

在这里插入图片描述

一键生成对应开发语言的聚合查询代码

在这里插入图片描述

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
1月前
|
数据采集 人工智能 安全
数据治理的实践与挑战:大型案例解析
在当今数字化时代,数据已成为企业运营和决策的核心资源。然而,随着数据量的爆炸性增长和数据来源的多样化,数据治理成为了企业面临的重要挑战之一。本文将通过几个大型案例,探讨数据治理的实践、成效以及面临的挑战。
数据治理的实践与挑战:大型案例解析
|
1月前
|
存储 NoSQL MongoDB
掌握MongoDB索引优化策略:提升查询效率的关键
在数据库性能调优中,索引是提升查询效率的利器。本文将带你深入了解MongoDB索引的内部工作原理,探讨索引对查询性能的影响,并通过实际案例指导如何针对不同的查询模式建立有效的索引。不仅将涵盖单一字段索引,还会探讨复合索引的使用,以及如何通过分析查询模式和执行计划来优化索引,最终实现查询性能的最大化。
|
2月前
|
存储 Cloud Native 关系型数据库
Ganos实时热力聚合查询能力解析与最佳实践
Ganos是由阿里云数据库产品事业部与飞天实验室共同研发的新一代云原生位置智能引擎,集成于PolarDB-PG、Lindorm、AnalyticDB-PG和RDS-PG等核心产品中。Ganos拥有十大核心引擎,涵盖几何、栅格、轨迹等多种数据处理能力,实现了多模多态数据的一体化存储、查询与分析。本文重点介绍了Ganos的热力瓦片(HMT)技术,通过实时热力聚合查询与动态输出热力瓦片,无需预处理即可实现大规模数据秒级聚合与渲染,适用于交通、城市管理、共享出行等多个领域。HMT相比传统网格聚合技术具有高效、易用的优势,并已在多个真实场景中验证其卓越性能。
51 0
|
11天前
|
存储 人工智能 自然语言处理
高效档案管理案例介绍:文档内容批量结构化解决方案解析
档案文件内容丰富多样,传统人工管理耗时低效。思通数科AI平台通过自动布局分析、段落与标题检测、表格结构识别、嵌套内容还原及元数据生成等功能,实现档案的高精度分块处理和结构化存储,大幅提升管理和检索效率。某历史档案馆通过该平台完成了500万页档案的数字化,信息检索效率提升60%。
|
15天前
|
存储 NoSQL MongoDB
MongoDB面试专题33道解析
大家好,我是 V 哥。今天为大家整理了 MongoDB 面试题,涵盖 NoSQL 数据库基础、MongoDB 的核心概念、集群与分片、备份恢复、性能优化等内容。这些题目和解答不仅适合面试准备,也是日常工作中深入理解 MongoDB 的宝贵资料。希望对大家有所帮助!
|
20天前
|
Prometheus 监控 Cloud Native
实战经验:成功的DevOps实施案例解析
实战经验:成功的DevOps实施案例解析
36 6
|
22天前
|
存储 NoSQL MongoDB
MongoDB 查询分析
10月更文挑战第21天
11 1
|
22天前
|
NoSQL MongoDB 索引
MongoDB 覆盖索引查询
10月更文挑战第21天
23 1
|
23天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
15 1
|
26天前
|
SQL NoSQL Unix
MongoDB 聚合
10月更文挑战第17天
19 4