当前位置: 首页 > news >正文

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. 收尾 & 路线

下载资源

可复现实验脚本与数据(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: { 
http://www.lryc.cn/news/622974.html

相关文章:

  • Tomcat类加载器原理简单介绍
  • AI热点周报(8.10~8.16):AI界“冰火两重天“,GPT-5陷入热议,DeepSeek R2模型训练受阻?
  • 服务器可以ping通,但部署的网站打不开
  • uniapp:微信小程序使用Canvas 和Canvas 2D绘制图形
  • nginx下载地址:aarch64
  • Scala面试题及详细答案100道(11-20)-- 函数式编程基础
  • 狗品种识别数据集:1k+图像,6个类别,yolo标注完整
  • linux docker neo4j 导出 (windows 导入)
  • duiLib 实现鼠标拖动状态栏时,窗口跟着拖动
  • 模型量化(Model Quantization)
  • 解决 Windows 下运行 MCP 脚本弹出 WSH 错误窗口的问题 | Windows Script Host
  • 【数据分析】比较SparCC、Pearson和Spearman相关性估计方法在合成组学数据上的表现
  • Footej Camera 2:专业级摄影体验,尽在掌中
  • 《代码重生:杨蓉与62.webp》
  • 2024-2025华为ICT大赛中国区 实践赛昇腾AI赛道(高职组)全国总决赛 理论部分真题+解析
  • 基本电子元件:金属氧化膜电阻器
  • 测试工程师的AI转型指南:从工具使用到测试策略重构
  • Vue组件基础解析
  • 机器学习--决策树
  • [Linux] RAID存储技术
  • 苍穹外卖日记
  • C:\Windows\WinSxS 目录详解
  • Python语言一键整理xhs评论 基于github的开源项目 MediaCrawler
  • MySQL 全文索引指南
  • Spring框架(AOP)
  • “openfeign“调用接口上传文件报错:Failed to deleted temporary file used for part [file]
  • 博士招生 | 香港大学 机器增强认知实验室 招收博士生/实习生/访问学生
  • 安卓11 12系统修改定制化_____修改系统默认域名解析规则 实现屏蔽广告 屏蔽应用更新等功能
  • CVE-2021-4300漏洞复现
  • css实现圆角+边框渐变+背景半透明