聚合操作处理多个文档并返回计算结果。您可以使用聚合操作来:
将多个文档中的值组合在一起。
对分组数据执行操作,返回单一结果。
分析一段时间内的数据变化。
查询最新版本的数据。
通过使用MongoDB中内置的聚合操作符,您可以在集群上执行分析,而无需将数据移动到另一个平台。
开始体验
若要执行聚合操作,您可以使用:
您可在用户界面中为 MongoDB Atlas 中托管的部署运行聚合管道。
聚合管道
聚合管道由一个或多个进程文档的 阶段组成。这些文档可以来自集合、视图或专门设计的阶段。
每个阶段都对输入文档执行操作。示例,阶段可以 $filter 文档、$group 文档并计算值。然后,一个阶段输出的文档将传递到管道中的下一阶段。
聚合管道可以返回文档组的结果。您还可以使用使用聚合管道进行更新中所示的阶段,通过聚合管道更新文档。
注意
使用 db.collection.aggregate() 方法运行的聚合管道不会修改集合中的文档,除非管道包含 $merge 或 $out 阶段。
聚合管道示例
本页上的示例使用sample_mflix示例数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载示例数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。
此管道会查找在数据库中执导过最多电影的前三名导演。
首先,添加 阶段以过滤列出导演的电影的文档(不包括导演字段为 null$match 或空的文档):
{ $match : { "directors" : { $exists: true, $ne: null, $not: {$size: 0} } } },
$match阶段通过过滤掉没有导演信息的电影来减少管道中的文档数量。接下来,使用$unwind 解构导演大量,以便我们可以计算每个导演的电影数量:
{ $unwind : "$directors" },
然后,按导演姓名$group 处理文档,计算每位导演制作的电影数量:
{ $group : { _id : "$directors", movieCount : { $sum: 1 } } },
要查找拥有最多电影的导演,请使用$sort 阶段按电影数量降序对剩余文档进行排序:
{ $sort : { movieCount : -1 } },
对文档进行排序后,使用$limit 阶段返回执导电影次数最多的前三名导演:
{ $limit : 3 }
完整的管道示例所示:
db.movies.aggregate( [ { $match : { "directors" : { $exists: true, $ne: null, $not: {$size: 0} } } }, { $unwind : "$directors" }, { $group : { _id : "$directors", movieCount : { $sum: 1 } } }, { $sort : { movieCount : -1 } }, { $limit : 3 } ] )
此管道返回以下结果:
[ { _id: 'Woody Allen', movieCount: 40 }, { _id: 'Martin Scorsese', movieCount: 32 }, { _id: 'Takashi Miike', movieCount: 31 } ]
有关包含样本输入文档的可运行示例,请参阅完整聚合管道示例。
了解有关聚合管道的更多信息
如需了解有关聚合管道的更多信息,请参阅聚合管道。
单一目的聚合方法
单一目的聚合方法聚合单个集合中的文档。这些方法很简单,但缺乏聚合管道的功能。
方法 | 说明 |
|---|---|
返回集合或视图中文档的近似数量。 | |
返回集合或视图中文档的数量。 | |
返回具有指定字段的不同值的文档数组。 |