聚合操作处理多个文档并返回计算结果。您可以使用聚合操作来:
对多个文档中的值进行分组。
根据分组数据计算单个结果。
分析一段时间内的数据变化。
查询最新版本的数据。
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 } ]
有关包含样本输入文档的可运行示例,请参阅完整聚合管道示例。
如需了解有关聚合管道的更多信息,请参阅聚合管道。
单一目的聚合方法
单一目的聚合方法聚合来自单个集合的文档。这些方法的功能少于聚合管道。
方法 | 说明 |
|---|---|
返回集合或视图中文档的近似数量。 | |
返回集合或视图中文档的数量。 | |
返回具有指定字段的不同值的文档数组。 |