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

举报
老陈聊架构 发表于 2022/07/26 21:30:58 2022/07/26
【摘要】 📣读完这篇文章里你能收获到 - 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

在这里插入图片描述

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

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。