MongoDB 聚合提速 3 招:$lookup 管道、部分索引、时间序列集合(含可复现实验与 explain 统计)

发布于:2025-08-17 ⋅ 阅读:(14) ⋅ 点赞:(0)

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: {
   
    

网站公告

今日签到

点亮在社区的每一天
去签到