MongoDB 聚合提速 3 招:$lookup 管道、部分索引、时间序列集合(含可复现实验与 explain 统计)
MongoDB 聚合提速 3 招:$lookup 管道、部分索引、时间序列集合(含可复现实验与 explain 统计)
目标:把“慢聚合”变“稳快聚合”。本文给出可复现数据集、索引与聚合写法、explain 统计脚本和命中速查表,让你能在自己的库里马上复刻与提速。
文章目录
- MongoDB 聚合提速 3 招:$lookup 管道、部分索引、时间序列集合(含可复现实验与 explain 统计)
-
- @[toc]
- 下载资源
- 0. 实验环境与一键启动
- 1. 可复现数据集(`mongosh` 粘贴执行)
- 2. 技巧一:$lookup 的**管道写法**(别一股脑全表连接)
-
- 2.1 反例(慢的常见写法)
- 2.2 正确姿势:**先 $match 再 $lookup(管道版)**
- 3. 技巧二:**部分索引(Partial Index)**把查询面变小
- 4. 技巧三:**时间序列集合**的聚合快路
- 5. 一键 **explain 统计**脚本(直接粘贴)
- 6. 索引命中 **速查表**
- 7. 实战:把慢聚合变快(练习脚本)
- 8. 常见坑与排查
- 9. 收尾 & 路线
文章目录
- MongoDB 聚合提速 3 招:$lookup 管道、部分索引、时间序列集合(含可复现实验与 explain 统计)
-
- @[toc]
- 下载资源
- 0. 实验环境与一键启动
- 1. 可复现数据集(`mongosh` 粘贴执行)
- 2. 技巧一:$lookup 的**管道写法**(别一股脑全表连接)
-
- 2.1 反例(慢的常见写法)
- 2.2 正确姿势:**先 $match 再 $lookup(管道版)**
- 3. 技巧二:**部分索引(Partial Index)**把查询面变小
- 4. 技巧三:**时间序列集合**的聚合快路
- 5. 一键 **explain 统计**脚本(直接粘贴)
- 6. 索引命中 **速查表**
- 7. 实战:把慢聚合变快(练习脚本)
- 8. 常见坑与排查
- 9. 收尾 & 路线
下载资源
可复现实验脚本与数据(CSDN 下载):
MongoDB 聚合提速脚本包
0. 实验环境与一键启动
- MongoDB 7.x,
mongosh
。 - 数据库:
demo
。 - 本地快速起(Docker):
docker run -d --name mongo -p 27017:27017 mongo:7
docker exec -it mongo mongosh
1. 可复现数据集(mongosh
粘贴执行)
1.1 造 users / orders
(50k 订单、加索引)
use("demo");
db.users.drop(); db.orders.drop();const N_USERS = 5000, N_ORDERS = 50000;
for (let i=1;i<=N_USERS;i++){db.users.insertOne({_id:i, email:`user${i}@demo.com`, level: ["NORMAL","VIP","SVIP"][Math.floor(Math.random()*3)]});
}// 订单:部分 PAID,含 userId / createdAt / total
const now = Date.now();
for (let i=1;i<=N_ORDERS;i++){const uid = 1 + Math.floor(Math.random()*N_USERS);db.orders.insertOne({_id: i,userId: uid,status: Math.random() < 0.7 ? "PAID" : "CREATED",total: 10 + Math.floor(Math.random()*300),createdAt: new Date(now - Math.floor(Math.random()*30)*86400000)});
}// 必备索引(后面会在此基础上做“部分索引”)
db.orders.createIndex({ userId:1, createdAt:-1 }); // 常用过滤+排序
db.users.createIndex({ email:1 }); // 举例
1.2 时间序列 metrics
(三台主机一天数据)
db.metrics.drop();
db.createCollection("metrics", {timeseries: {