# MongoDB 聚合查询

# 什么是 MongoDB 聚合框架

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

使用 聚合管道 可以对集合中的文档进行变换和组合。

实际项目中:主要用于 表关联查询数据的统计等。

先看下官网给的实例,感受一下 聚合管道 的用法。

聚合管道

上图中,进行的操作是:匹配 ordersstatus 字段为 'A' 的数据,然后根据 cust_id 字段进行分组。并对分组后的数据,根据 amount 字段进行求和操作。

# 管道(Pipeline)和步骤(Stage)

整个聚合运算过程称为 管道(Pipeline),它是由多个 步骤(Stage)组成的,

每个管道:

  • 接受一系列文档(原始数据);
  • 每个步骤对这些文档进行一系列运算;
  • 结果文档输出给下一个步骤;

管道(Pipeline)和步骤(Stage)

# 聚合运算语法

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

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

# 常见步骤(操作符)

步骤(操作符) 作用 SQL等价运算符
$match 条件匹配。只满足条件的文档才能进入下
一阶段
WHERE
$project 投影,可以重命名,删除或增加文档字段 AS
$sort 条件排序 ORDER BY
$group 条件分组 GROUP BY
$skip 跳过文档的数量 SKIP
$limit 限制结果的数量 LIMIT
$lookup 多表关联查询 JOIN
$unwind 展开数组 N/A
$graphLookup 图搜索 N/A
$facet/$bucket 分面搜索 N/A

# 常见步骤中的运算符

$match $project $group
•$eq/$gt/$gte/$lt/$lte
•$and/$or/$not/$in
•$geoWithin/$intersect
•……
•选择需要的或排除不需要的字段
•$map/$reduce/$filter
•$range
•$multiply/$divide/$substract/$add
•$year/$month/$dayOfMonth/$hour/$minute/$second
•……
•$sum/$avg
•$push/$addToSet
•$first/$last/$max/$min
•……

管道表达式:

管道操作符(步骤)作为 ,所对应的 叫做 管道表达式

例如 {$match:{status:"A"}}$match 称为 管道操作符 (步骤),而 status:"A" 称为管道表达式,是管道操作符的 操作数(Operand)

每个管道表达式是一个文档结构,它是由字段名字段值、和一些表达式操作符组成的。

# 聚合运算的使用场景

聚合查询可以用于 OLAPOLTP 场景。例如:

OLTP OLAP
● 计算 ● 分析一段时间内的销售总额、均值
● 计算一段时间内的净利润
● 分析购买人的年龄分布
● 分析学生成绩分布
● 统计员工绩效

# MQL 特有步骤 $unwind

MQL 特有步骤 $unwind

使用 $unwind,把 score 字段,数组中的数据展开来,其他字段保留。更适合,报表分析等。

# MQL 特有步骤 $bucket

MQL 特有步骤 $bucket

通过上面的查询语句,可以统计每个价格区间的数据有多少条。

# MQL 特有步骤 $facet

MQL 特有步骤 $facet

通过上面的查询语句,可以统计多个维度,对应多个区间的数据有多少条。

比如每个价格区间的数据有多少条。每个生产日期区间的数据有多少条等。

# 参考

更新时间: 6/25/2020, 2:16:12 AM