Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs 菜单
Docs 主页
/ /

聚合管道 (Aggregation Pipeline)

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

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

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

注意

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

您可以 在用户界面运行聚合管道,用于 MongoDB Atlas 中托管的部署。

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

完整聚合管道教程部分包含常见聚合任务的分步教程,并提供MongoDB Shell和每个官方MongoDB驱动程序的示例。

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

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

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

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

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

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

组件
例子

常量

3

操作符

字段路径表达式

"$<path.to.field>"

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

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

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

"$<field>" 等效于 "$$CURRENT.<field>",其中 CURRENT 是一个系统变量,默认为当前对象的根,除非阶段另行指定。

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

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

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

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

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

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

  • 不应使用 map-reduce,而应使用聚合管道。聚合管道提供比 map-reduce 更好的性能和可用性。

  • 您可以使用聚合管道阶段(例如 $group$merge 等)重写 map-reduce 操作。

  • 对于需要自定义功能的 map-reduce 操作,可以使用 $accumulator$function 聚合操作符。可以使用这些操作符在 JavaScript 中定义自定义聚合表达式。

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

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

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

后退

聚合操作

获得技能徽章

免费掌握“数据转换基础”!

了解详情

在此页面上