- $match/$limit 前移:首阶段 $match 直接利用索引,能砍掉后续全部计算量
- 用 $project 裁剪字段:越早减少字段与文档体积,后续排序分组越轻
- $sort 放在被截断前:$sort 紧跟 $limit 可走堆排序
- $lookup 控制关联侧:foreignField 建索引或改管道式写法先过滤
- 大分组设置 allowDiskUse:避免 100MB 内存上限报错
先瘦身再分组
先瘦身再分组
db.events.aggregate([
{ $match: { day: "2026-10-12" } },
{ $project: { userId: 1, action: 1, _id: 0 } },
{ $group: { _id: { userId: "$userId", action: "$action" }, n: { $sum: 1 } } }
])用 explain 的 executionStats 检查首阶段是否 IXSCAN、扫描量是否与返回量接近。