博客
概述
MongoDB学习笔记:聚合之介绍。
前言
初衷:MongoDB 的使用还是有一定难度的,官网的讲解一环牵扯一环,不容易一下子把握住重点,也不利于快速查询操作,所以整理一下。
(本文第一版是2018年7月4完成,8月30日感觉这篇文章的结构和后来写的结构不太统一,思路也不统一,所以对其进行一定的修改。)
正文
概念
聚合函数是对记录集(data records)进行操作,是把多条记录集合(group)在一起,进行一些统一的操作,返回一个结果,与此相对应的是SQL 的 group by 等操作,这是数据处理所涉及的一个方面,对很多具有一定相同属性的数据整体进行处理。
MongoDB 提供三种聚合方法:
- 聚合管道。
- map-reduce 函数。
- 单一功能的聚合方法。
聚合管道
接触过linux shell
的人应该对管道不会陌生,管道就是对输入的数据进行一系列的处理、转换,变成新的数据。
这里的聚合管道是对记录集进行多阶段(multi-stage)的转换,转换文档为一个新的聚合结果,例如:
1 | db.orders.aggregate([ |
解释一下:
- 数据集合:
orders
,共有4条记录,这里省略了_id
这个域。 - 需求:查找所有
status="A"
的记录,根据cust_id进行分组,计算每个组的amount
的和。 - 分析:
{$match: {status: "A"}}
,第一个阶段,匹配阶段,查找所有status="A"
的记录。{$group: {_id: "$cust_id", total: {$sum: "$amount"}}}
,第二个阶段,分组计算,根据cust_id
进行分组,对每个组的amount
进行求和。这里涉及$group
的语法,如下:
1 | { $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } } |
其中,_id是强制的,后面是可选的。<accumulator1>
是累加操作符,参考这里,例如这里的$sum
,注意,这里必须要加$
。<expression1>
是表达式,有待补充, "$amount"
, 表示是去取上一个结果中的amount
这个域,对其进行累加,并把结果存入新的域total
中。
这个例子看明白了,聚合就基本明白了。
Map-Reduce
map-reduce操作分为两个阶段:map 阶段,处理每一条记录,产出一个或多个对象;reduce 阶段,合并 map 阶段的输出。作为可选,map-reduce可以有一个最终阶段来对结果进行最终的操作。map-reduce 也可以进行查询、排序和限制输出结果。
图片取自 MongoDB 官网。
这个例子的顺序有点不太好理解,先做 query,然后是 map,reduce, 但是在指令中,则是先有 map。
In this map-reduce operation, MongoDB applies the map phase to each input document (i.e. the documents in the collection that match the query condition). The map function emits key-value pairs. For those keys that have multiple values, MongoDB applies the reduce phase, which collects and condenses the aggregated data. MongoDB then stores the results in a collection. Optionally, the output of the reduce function may pass through a finalize function to further condense or process the results of the aggregation.
在这个过程中,MongoDB 应用 map 去针对每一条输入文档(这些文档是满足了 query 查询条件的)。map 函数 emit (发射出)key-value 对,对于那些有多值的 key,MongoDB 使用 reduce,来收集和浓缩这些聚集数据。
单一功能的聚合方法
MongoDB也提供db.collection.count()
(求和)和db.collection.distinct()
(去重)函数。
图片取自 MongoDB 官网。
总结
关于聚合,总体的概念总结到这里,下一步,需要细化了。
(2019-12-02)
又复习整理了一遍聚合,感觉理解的更加清楚了。
之前的图片都失效了,把这些图片都补上了。
参考
https://docs.mongodb.com/manual/aggregation/#single-purpose-agg-operations
https://docs.mongodb.com/manual/core/map-reduce/