对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

聚合管道 (Aggregation Pipeline)

聚合管道由一个或多个进程文档的阶段组成。这些文档可以来自集合、视图或专门设计的阶段。

每个阶段都对输入文档执行操作。示例,阶段可以 $filter 个文档、$group 个文档并计算值。然后,一个阶段输出的文档将传递到管道中的下一阶段。

聚合管道可以返回文档组的结果。您还可以使用使用聚合管道进行更新中所示的阶段,通过聚合管道更新文档。

注意

使用 db.collection.aggregate() 方法运行的聚合管道不会修改集合中的文档,除非管道包含 $merge 或 $out 阶段。

当您在 MongoDB Atlas 用户界面中的 MongoDB Atlas 部署上运行聚合管道时,您可以预览每个阶段的结果。

You can also use an LLM to generate aggregation pipelines from natural language. To learn more, see Natural Language to MongoDB Queries.

The Complete Aggregation Pipeline Tutorials section contains step-by-step tutorials for common aggregation tasks, with examples for MongoDB Shell and each of the official MongoDB drivers.

要运行聚合管道,请使用:

聚合管道由一个或多个处理文档的阶段组成:

  • 阶段不需要为每个输入文档输出一个文档。某些阶段会产生新文档或过滤掉文档。

  • 同一阶段可以在管道中多次出现,但以下阶段除外:$out、$merge 和 $geoNear。

有关所有聚合阶段,请参阅聚合阶段。

在聚合管道中,表达式定义阶段如何处理管道中的每个输入文档。例如,表达式可以定义要包含的文档、如何重新塑造字段或如何计算新值。

某些聚合管道阶段接受表达式。运算符根据输入表达式计算值。

在 MongoDB 查询语言中,您可以从以下组件构建表达式:

组件
例子

常量

3

操作符

字段路径表达式

"$<path.to.field>"

示例,{ $add: [ 3, "$inventory.total" ] } 是由 $add操作符和两个操作数组成的表达式:

表达式返回将 3 添加到输入文档中路径 inventory.total 处的值的结果。

注意

访问 $map、$ 过滤和 $reduce 中的数组元素索引

MongoDB 8.3 改进了对 $map、$filter 和 $reduce 聚合表达式中数组元素索引的访问权限。您可以使用新的 arrayIndexAs字段设立变量以存储数组元素的索引。如果省略 arrayIndexAs,还可以使用新的 $$IDX 聚合系统变量来访问当前数组元素的索引。

字段路径(Field Path)表达式访问输入文档中的字段。在字段名称前加上美元符 $。例如,"$user" 引用 user 字段,"$user.name" 引用嵌入式 user.name 字段。

有关更多示例,请参阅 字段路径(Field Path)。

要使用聚合管道更新文档,请使用:

有关值类型和结果大小的限制,请参阅聚合管道限制。

聚合管道支持针对分片集合的操作。请参阅聚合管道和分片集合。

重要

Aggregation Pipeline 作为 Map-Reduce 的替代方案

从 MongoDB 5.0 开始,map-reduce 已弃用。

有关 map-reduce 的聚合管道替代方案的示例,请参阅:

要了解有关聚合管道的详细信息,请参阅: