聚合操作处理多个文档并返回计算结果。您可以使用聚合操作来:
将多个文档中的值分组。
从分组数据计算单个结果。
分析一段时间内的数据变化。
查询最新版本的数据。
MongoDB 中的聚合操作符可让您在集群上运行分析,而无需将数据移动到另一个平台。
开始体验
若要执行聚合操作,您可以使用:
您可在用户界面中为 MongoDB Atlas 中托管的部署运行聚合管道。
聚合管道
聚合管道由一个或多个处理文档的 阶段组成:
每个阶段对输入文档执行一个操作。例如,某个阶段可以过滤文档、对文档进行分组并计算值。
从一个阶段输出的文档将传递到下一阶段。
一个聚合管道可以返回针对文档组的结果。例如,返回总值、平均值、最大值和最小值。
如使用通过聚合管道更新中显示的阶段,则可以通过聚合管道更新文档。
注意
使用 db.collection.aggregate() 方法运行的聚合管道不会修改集合中的文档,除非管道包含 $merge 或 $out 阶段。
聚合管道示例
本页上的示例使用sample_mflix示例数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载示例数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。
以下管道可找到在数据库中执导电影最多的前三名主管。
使用 $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 } ]
有关包含样本输入文档的可运行示例,请参阅完整聚合管道示例。
如需了解有关聚合管道的更多信息,请参阅聚合管道。
单一目的聚合方法
单一目的聚合方法从单一集合中聚合文档。这些方法的功能少于聚合管道。
方法 | 说明 |
|---|---|
返回集合或视图中文档的近似数量。 | |
返回集合或视图中文档的数量。 | |
返回具有指定字段的不同值的文档数组。 |