- MongoDB 聚合框架(Aggregation Framework)是一个计算框架,它可以:
- 作用在一个或几个集合上;
- 对集合中的数据进行的一系列运算;
- 将这些数据转化为期望的形式;
- 从效果而言,聚合框架相当于 SQL 查询中的:
- GROUP BY
- LEFT OUTER JOIN
- AS等
- 整个聚合运算过程称为管道(Pipeline),它是由多个步骤(Stage)组成的,每个管道:
- 接受一系列文档(原始数据);
- 每个步骤对这些文档进行一系列运算;
- 结果文档输出给下一个步骤;
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 |
---|---|
计算 | 分析一段时间内的销售总额、均值 计算一段时间内的净利润 分析购买人的年龄分布 分析学生成绩分布 统计员工绩效 |
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
指定字段按指定区间进行分组统计
$facet
指定多个字段分别$bucket
分组统计