MongoDB聚合操作

温馨提示:点击页面下方以展开或折叠目录

摘要:7.26~8.6参加了为期12天的培训,MongoDB最重要的聚合也迟迟未能更新。

文章说明
文章作者:鴻塵
文章链接:https://hwame.top/20210806/mongodb-aggregation-operation.html
参考资料:

聚合操作

MongDDB中集合操作(aggregation)处理数据记录并返回计算结果,聚合操作将来自多个文档的值结合在一起,并且可以对分组数据执行各种操作以返回单个结果。

MongoDB提供了三种执行聚合操作的方法:聚合管道【最常用】、map-reduce函数单一用途聚合方法

聚合操作方法:db.collection.aggregate(pipeline=<arr>, options=[doc])

pipeline,一系列数据聚合「操作operation」或「阶段stage」,详见聚合管道运算符

我的理解是,pipeline是由「阶段stage(将operation也称stage更易于理解)」组成的数组,官方文档描述不贴切 / 或者说翻译字面意思过于近似,而且官方文档都在https://docs.mongodb.com/manual/reference/operator/aggregation/*同一路由下,没有区分「aggregation-stage」和「aggregation-operator」。

A sequence of data aggregation oparotions or stages.理解为stage,operation和operator的区别可以意会。

在禁用options参数时,可以将「管道阶段」作为单独的参数而不是数组中的元素。

通常「聚合管道」包括了「聚合管道 阶段stage」 和「聚合管道 操作符operator」。

  • 管道阶段https://docs.mongodb.com/manual/aggregation/#aggregation-pipeline
    • 最基本的 管道阶段 提供「过滤器(与查询类似)」和「文档转换(修改输出形式)」。
    • 其他 管道操作 提供工具,用于①按字段对文档进行分组和排序,②聚合数组内容或文档数组。
    • 此外, 管道阶段 可以使用「运算符(操作符)operator」执行诸如计算平均值或连接字符串之类的任务。
  • 管道操作符。

Accumulators used in GROUP stage

aggregate例子$group当中的{$sum: 1},按照$group的条件,满足一条就加1。如下例,也就是count$group中,每种zipcode的数量:

1
2
3
4
5
6
db.restaurants.aggregate(
[
{$match: {"borough": "Queens", "cuisine": "Brazilian"}}
{$group: {"_id": "$address.zipcode", "count": {$sum: 1}}}
]
);

{$sum: 1}等价于{$count: {}}

1
2
3
4
5
6
7
SELECT COUNT(*)
FROM (SELECT cust_id,
ord_date
FROM orders
GROUP BY cust_id,
ord_date)
as DerivedTable