目录
聚合是MongoDB的高级查询框架,实际上在MySQL等关系数据库中,也有GROUP BY这样的类似功能。其主要作用是,从多个文档中提取、转换和整合数据,形成新的信息,可以用来发现文档间的一些关系,或者挖掘单个文档不具备的信息。例如,春节快到了,如果一家商店的店长想统计每月销售额、每种商品销售额、整年销售额,就必须以时间或商品ID作为分组条件进行统计。MongoDB提供了聚合和MapReduce两种工具,聚合要简单些。
一.聚合&管道
管道是计算机领域一个很普遍的概念,指的是对于一系列操作,前一个操作的结果通过管道输送给后一个操作,作为其输入。一个典型例子是linux的管道,通过配合grep、awk等工具,可以很方便的从命令行输出中提取出需要的信息。
1.操作
MongoDB有如下管道操作:
- $project:可以用来修改文档的结构,类似于SQL的select
- 可以用来对域进行重命名
- 可以用来增加成员域
- 可以删除指定域
- $match:用于过滤出符合指定条件的文档,类似于SQL的where或having
- $limit:用来限制管道流量
- $skip:用来跳过指定数量的文档,返回剩余的文档
- $unwind:将文档中某个数组类型字段进行拆分,为数组中的一个元素生成一个文档,类似于SQL的join
- $group:将文档分组,类似于SQL的group by
- 对于时间:
- $dayOfYear: 返回该日期是这一年的第几天(全年 366 天)。
- $dayOfMonth: 返回该日期是这一个月的第几天(1到31)。
- $dayOfWeek: 返回的是这个周的星期几(1代表星期日,7代表星期六)。
- $year: 返回该日期的年份部分。
- $month: 返回该日期的月份部分( 1 到 12)。
- $week: 返回该日期是所在年的第几个星期( 0 到 53)。
- $hour: 返回该日期的小时部分。
- $minute: 返回该日期的分钟部分。
- $second: 返回该日期的秒部分(以0到59之间的数字形式返回日期的第二部分,但可以是60来计算闰秒)。
- $millisecond:返回该日期的毫秒部分( 0 到 999)。
- $dateToString: { $dateToString: { format,date} } 按照format的格式,将date转换为字符串
- 对于其他字段:使用聚合操作符
- $sum:计算总和
- $avg:计算平均值
- $min:获取某个字段的最小值
- $max:获取某个字段的最大值
- $push:将结果插入到一个数组中
- $addToSet:将结果插入到Set中(即不存在重复文档)
- $first:按照指定字段排序,获取第一个文档
- $last:按照指定字段排序,获取最后一个文档
- 对于时间:
- $sort:对输入的文档进行排序
- $geoNear:输出接近某一地理位置的GEO文档
- $out:把管道内的文档写入集合
- $redact:控制对某些数据的访问
聚合管道的使用形式为:
db.collection_name.aggregate(pipeline,options)
有如下选项:
- explain:打印执行计划,布尔值
- allowDiskUse:使用磁盘暂存中间结果,布尔值,主要是为了解决中间数据太大(100MB以上)导致的报错
- cursor:用于逐个获取管道结果,避免超出16MB限制