1. $match、$project、$group、$sort、$limit 的执行顺序优化?
请解释 $match、$project、$group、$sort、$limit 等聚合阶段的执行顺序及优化策略?
- $match 前置以利用索引、减少数据量
- $project 提前裁剪字段
- $group/$sort 阻塞,$limit 配合 $sort 做 top-k
聚合管道各阶段的执行顺序影响性能,优化策略是:把 $match 放到最前,因为它能用索引过滤并大幅减少后续阶段的数据量;$project 尽早执行以裁剪字段,减少内存与传输;$group 与 $sort 是阻塞型阶段,需收集全部数据后进行,占用内存;$limit 紧跟 $sort 时可做 top-k 优化(只保留前 N 条,避免全量排序);$limit 单独放在前面可减少后续处理的数据量。优化器会自动做部分重排(如把 $match 提前),但开发者主动按"过滤→裁剪→分组→排序→限制"的顺序写,能获得更优的执行计划。应避免把 $match 放在 $group 之后(过滤效果差)。
聚合优化的核心是"数据越早越小越好"。$match 前置利用索引、$project 提前裁剪、$sort+$limit 做 top-k,都是减少数据量与内存的要点。理解各阶段"过滤/裁剪/阻塞/限制"的特性,才能写出高效管道。优化器重排是辅助,主动顺序才是关键。