什么是 MongoDB 聚合框架
  • MongoDB 聚合框架(Aggregation Framework)是一个计算框架,它可以:
    • 作用在一个或几个集合上;
    • 对集合中的数据进行的一系列运算;
    • 将这些数据转化为期望的形式;
  • 从效果而言,聚合框架相当于 SQL 查询中的:
    • GROUP BY
    • LEFT OUTER JOIN
    • AS等
管道(Pipeline)和步骤(Stage)
  • 整个聚合运算过程称为管道(Pipeline),它是由多个步骤(Stage)组成的,每个管道:
    • 接受一系列文档(原始数据);
    • 每个步骤对这些文档进行一系列运算;
    • 结果文档输出给下一个步骤;

MongoDB 聚合查询_MySQL

聚合运算的基本格式
pipeline = [$statge1, $stage2, ...$stageN];

db.<COLLECTION>.aggregate(
	pipeline,
	{	options }
);
常见步骤
步骤 作用 SQL等价运算符
$match 过滤 WHERE
$project 投影 AS
$sort 排序 ORDER BY
$group 分组 GROUP BY
$skip/$limit 结果限制 SKIP/LIMIT
$lookup 左外连接 LEFT OUTER JOIN
常见步骤中的运算符
$match $project $group
$eq/$gt/$gte/$lt/$lte 选择需要的或排除不需要的字段 $sum/$avg
$and/$or/$not/$in $map/$reduce/$filter $push/$addToSet
$geoWithin/$intersect $range $first/$last/$max/$min
  $multiply/$divide/$substract/$add  
  $year/$month/$dayOfMonth/$hour/$minute/$second  
步骤 作用 SQL等价运算符
$unwind 展开数组 N/A
$graphLookup 图搜索 N/A
    N/A
聚合运算的使用场景

聚合查询可以用于OLAP和OLTP场景。例如:

OLTP OLAP
计算 分析一段时间内的销售总额、均值
计算一段时间内的净利润
分析购买人的年龄分布
分析学生成绩分布
统计员工绩效
MQL 常用步骤与 SQL 对比
SELECT 
	FIRST_NAME AS `名`,
	LAST_NAME AS `姓`,
FORM Users
WHERE GENDER = '男'
SKIP 100
LIMIT 20
db.users.aggregate([
	{$match: {gender: "男"}},
	{$skip: 100},
	{$limit: 20},
	{$project: {
		"名": $first_name,
		"姓": $last_name
	}}
]);
SELECT DEPARTMENT,
	COUNT(NULL) AS EMP_QTY 
FROM Users
WHERE GENDER = '女'
GROUP BY DEPARTMENT HAVING
COUNT(*) < 10
db.users.aggregate([
	{$match: {gender: '女'}},
	{$group: {
		_id: $DEPARTMENT,
		emp_qty: {$sum: 1}
	}},
	{$match: {$emp_qty: {$lt: 10}}}
]);
MQL 特有步骤 $unwind

$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}}
MQL 特有步骤 $bucket

$bucket指定字段按指定区间进行分组统计

MongoDB 聚合查询_数据_02

MQL 特有步骤 $facet

$facet指定多个字段分别$bucket分组统计
MongoDB 聚合查询_MySQL_03