MongoDB学习笔记:聚合之介绍

博客

IT老兵博客

概述

MongoDB学习笔记:聚合之介绍。

前言

初衷:MongoDB 的使用还是有一定难度的,官网的讲解一环牵扯一环,不容易一下子把握住重点,也不利于快速查询操作,所以整理一下。

(本文第一版是2018年7月4完成,8月30日感觉这篇文章的结构和后来写的结构不太统一,思路也不统一,所以对其进行一定的修改。)

正文

概念

聚合函数是对记录集(data records)进行操作,是把多条记录集合(group)在一起,进行一些统一的操作,返回一个结果,与此相对应的是SQL 的 group by 等操作,这是数据处理所涉及的一个方面,对很多具有一定相同属性的数据整体进行处理。

MongoDB 提供三种聚合方法:

  1. 聚合管道。
  2. map-reduce 函数。
  3. 单一功能的聚合方法。

聚合管道

接触过linux shell的人应该对管道不会陌生,管道就是对输入的数据进行一系列的处理、转换,变成新的数据。

这里的聚合管道是对记录集进行多阶段(multi-stage)的转换,转换文档为一个新的聚合结果,例如:

1
2
3
4
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])

解释一下:

  1. 数据集合:orders,共有4条记录,这里省略了_id 这个域。
  2. 需求:查找所有status="A" 的记录,根据cust_id进行分组,计算每个组的amount的和。
  3. 分析:
    {$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 官网
图片取自 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/