MongoDB 聚合查询
什么是 MongoDB 聚合框架
- MongoDB 聚合框架(Aggregation Framework)是一个计算框架,它可以:
- 作用在一个或几个集合上;
- 对集合中的数据进行的一系列运算;
- 将这些数据转化为期望的形式;
- 从效果而言,聚合框架相当于 SQL 查询中的:
- GROUP BY
- LEFT OUTER JOIN
- AS等
管道(Pipeline)和步骤(Stage)
- 整个聚合运算过程称为管道(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 |
---|---|
计算 | 分析一段时间内的销售总额、均值 计算一段时间内的净利润 分析购买人的年龄分布 分析学生成绩分布 统计员工绩效 |
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
指定字段按指定区间进行分组统计
MQL 特有步骤 $facet
$facet
指定多个字段分别$bucket
分组统计
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通