当前位置: 首页 > 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.dtcms.com/a/334469.html

相关文章:

  • 片料矫平机·第四篇
  • Element Plus 中 el-input 限制为数值输入的方法
  • 暴雨服务器:以定制化满足算力需求多样化
  • 深入剖析跳表:高效搜索的动态数据结构
  • 【测试工具】OnDo SIP Server--轻松搭建一个语音通话服务器
  • 社保、医保、个税、公积金纵向横向合并 python3
  • 深入理解 Vue Router
  • Centos7.9安装Dante
  • 04时间复杂度计算方法
  • Python 桌面应用形态后台管理系统的技术选型与方案报告
  • Linux系统之lslogins 命令详解
  • vector 手动实现 及遇到的各种细节问题
  • 深入剖析 TOTP 算法:基于时间的一次性密码生成机制
  • Golang分布式事务处理方案
  • 如何在win服务器中部署若依项目
  • JVM垃圾回收器
  • 深度解析Java synchronized关键字及其底层实现原理
  • python学习DAY43打卡
  • C++实战
  • 如果构建企业本地的ERP智能ai系统,让先进的大模型数据处理ERP的各类数据,更加轻松智能,准确?从企业资源计划ERP变成企业资源智能EPA的升级
  • CUDA 编程笔记:CUDA内存模型概述
  • 【数据库】Oracle学习笔记整理之五:ORACLE体系结构 - 参数文件与控制文件(Parameter Files Control Files)
  • 虚拟专用网技术
  • Gradle#构建生命周期三个阶段
  • PyTorch神经网络工具箱(如何构建神经网络?)
  • 基于几何平面的寻路算法:SPEV1Auxiliary全面解析
  • 数据库Microsoft Access、SQL Server和SQLite三者对比及数据库的选型建议
  • Win11家庭版docker安装Minio
  • HTTP 1.0, 2.0 和 3.0 有什么区别?
  • Day11 栈与队列part2