MongoDB学习笔记:聚合之介绍

完整的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. 数据集合: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也提供db.collection.count()(求和)和db.collection.distinct()(去重)函数。
这里写图片描述

总结

关于聚合,总体的概念总结到这里,下一步,需要细化了。

参考

https://docs.mongodb.com/manual/aggregation/#single-purpose-agg-operations