MongoDB 聚合提速 3 招:$lookup 管道、部分索引、时间序列集合(含可复现实验与 explain 统计)
目标:把“慢聚合”变“稳快聚合”。本文给出可复现数据集、索引与聚合写法、explain 统计脚本和命中速查表,让你能在自己的库里马上复刻与提速。
下载资源
可复现实验脚本与数据(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: {