MongoDB 6.0 聚合管道未新增阶段,但默认启用 allowDiskUse,超100MB内存自动写磁盘;$lookup 在分片集群中增强支持;$$SEARCH_META 使用受限。

MongoDB 6.0 的聚合管道本身没有新增阶段,但关键变化集中在性能、行为约束和兼容性上——尤其是 allowDiskUse 默认行为、$lookup 在分片集群中的支持提升,以及 $$SEARCH_META 的使用限制。
allowDiskUse 默认启用,但需注意磁盘空间占用
从 MongoDB 6.0 开始,当某个聚合阶段(如 $group、$sort)内存消耗超过 100MB 时,系统会自动将临时文件写入磁盘,不再报错或要求显式传 { allowDiskUse: true }。
- 这是默认行为,无需手动开启;但如果部署环境磁盘紧张,得主动监控
/tmp或dbPath下的临时文件目录 - 若想禁用该行为(比如防止意外写满磁盘),可在聚合调用中显式加
{ allowDiskUse: false } - 早期版本(
$lookup 在分片集群中终于可用且性能大幅提升
MongoDB 6.0 是首个在分片集群中全面支持 $lookup(含 $graphLookup)的正式版本,此前只能在非分片集合或主分片上运行,且性能差。
- 现在
$lookup可跨分片执行,但被关联的集合(from)必须是非分片集合,或与主集合共享相同分片键(否则会触发广播查询,性能骤降) - 官方称性能提升可达百倍,实际取决于是否命中本地分片、是否能下推过滤条件到
localField/foreignField - 别在
$lookup后直接接$unwind处理大数组——这极易触发内存超限,建议先用$limit或$sample控制结果集大小
$$SEARCH_META 只能在 $search 后、$lookup/$unionWith 前使用
Atlas Search 引入的 $$SEARCH_META 变量,在 6.0 中有了明确的生命周期边界:它只在 $search 阶段之后、且尚未进入 $lookup 或 $unionWith 阶段时有效。
- 常见错误是把
$$SEARCH_META放在$lookup后面,比如{ $lookup: {...} }, { $addFields: { score: "$$SEARCH_META.score" } }—— 这会报错undefined variable $$SEARCH_META - 正确顺序应为:
$search→$addFields(引用$$SEARCH_META)→$lookup(不能再引用) - 如果需要在关联后仍用搜索元信息,得提前存到字段里,例如
{ $addFields: { searchScore: "$$SEARCH_META.score" } }
真正容易踩坑的是 allowDiskUse 的“静默启用”和 $$SEARCH_META 的阶段顺序限制——这两个不报错但结果不对的问题,调试起来最耗时间。


















