Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs 菜单
Docs 主页
/

聚合操作

聚合操作处理多个文档并返回计算结果。您可以使用聚合操作来:

  • 将多个文档中的值组合在一起。

  • 对分组数据执行操作,返回单一结果。

  • 分析一段时间内的数据变化。

  • 查询最新版本的数据。

通过使用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 }
]

有关包含样本输入文档的可运行示例,请参阅完整聚合管道示例。

如需了解有关聚合管道的更多信息,请参阅聚合管道。

单一目的聚合方法聚合单个集合中的文档。这些方法很简单,但缺乏聚合管道的功能。

方法
说明

返回集合或视图中文档的近似数量。

返回集合或视图中文档的数量。

返回具有指定字段的不同值的文档数组。

后退

货币数据

获得技能徽章

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

了解详情

在此页面上