当前位置: 首页 > 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.xdnf.cn/news/1307611.html

相关文章:

  • 完整设计 之 智能合约系统:主题约定、代理协议和智能合约 (临时命名)----PromptPilot (助手)答问之2
  • JavaEE 初阶第十九期:网络编程“通关记”(一)
  • 【Java学习】锁、线程死锁、线程安全2
  • 【C++】动态内存管理
  • 代码随想录Day52:图论(孤岛的总面积、沉没孤岛、水流问题、建造最大岛屿)
  • Ubuntu2204server系统安装后的初始化配置报错
  • ubuntu 20.04 安装anaconda以及安装spyder
  • GitHub PR 提交流程
  • 双向SSL认证之Apache实战配置
  • 从“Hello World”到“高并发中间件”:Go 语言 2025 系统学习路线图
  • 系统思考:情绪内耗与思维模式
  • linux服务器查看某个服务启动,运行的时间
  • DAY 46 通道注意力(SE注意力)
  • 【100页PPT】数字化转型某著名企业集团信息化顶层规划方案(附下载方式)
  • termios 线程 poll epoll进化 二叉AVL红黑树
  • 智能工厂生产监控大屏-vue纯前端静态页面练习
  • PowerShell 格式化系统完全掌握(下):自定义列/格式字符串/对齐与宽度 + 实战模板
  • System V通信机制
  • Docker之安装部署——(1)配置国内docker镜像源
  • 【Twincat3】IO的SCAN 不可选中,SCAN中后扫描不到设备
  • 代码随想录二刷之“字符串”~GO
  • 嵌入式开发学习———Linux环境下网络编程学习(二)
  • 科普:Pygame 中,`pg.Surface` v.s. `screen`
  • 电工的基础知识以及仪器的使用
  • 浏览器面试题及详细答案 88道(45-55)
  • 吉他和弦学习:从音程基石到流畅弹奏
  • 机器学习——PCA(主成分分析)降维
  • MySQL快速恢复数据的N种方案完全教程
  • JavaWeb开发_Day12
  • 云原生俱乐部-杂谈2