参见:http://www.cnblogs.com/liruihuan/p/6686570.html
MongoDB 的聚合功能,聚合操作主要用于对数据的批量处理,往往将记录按条件分组以后,然后再进行一系列操作,例如,求最大值、最小值、平均值,求和等操作。聚合操作还能够对记录进行复杂的操作,主要用于数理统计和数据挖掘。在 MongoDB 中,聚合操作的输入是集合中的文档,输出可以是一个文档,也可以是多条文档。
MongoDB 提供了非常强大的聚合操作,有三种方式:
- 聚合管道(Aggregation Pipeline)
- 单目的聚合操作(Single Purpose Aggregation Operation)
- MapReduce 编程模型
在本篇中,重点讲解聚合管道和单目的聚合操作,MapReduce 编程模型会在后续的文章中讲解。
1、聚合管道
聚合管道是 MongoDB 2.2版本引入的新功能。它由阶段(Stage)组成,文档在一个阶段处理完毕后,聚合管道会把处理结果传到下一个阶段。
聚合管道功能:
- 对文档进行过滤,查询出符合条件的文档
- 对文档进行变换,改变文档的输出形式
每个阶段用阶段操作符(Stage Operators)定义,在每个阶段操作符中可以用表达式操作符(Expression Operators)计算总和、平均值、拼接分割字符串等相关操作,直到每个阶段进行完成,最终返回结果,返回的结果可以直接输出,也可以存储到集合中。
MongoDB 中使用 db.COLLECTION_NAME.aggregate([{<stage>},...]) 方法来构建和使用聚合管道。先看下官网给的实例,感受一下聚合管道的用法。
实例中,$match 用于获取 status = "A" 的记录,然后将符合条件的记录送到下一阶段 $group 中进行分组求和计算,最后返回 Results。其中,$match、$group 都是阶段操作符,而阶段 $group 中用到的 $sum 是表达式操作符。
在下面,我们通过范例分别对阶段操作符和表达式操作符进行详解。
1.1、阶段操作符
使用阶段操作符之前,我们先看一下 article 集合中的文档列表,也就是范例中用到的数据。
>db.article.find().pretty(){ "_id": ObjectId("58e1d2f0bb1bbc3245fa7570")
"title": "MongoDB Aggregate",
"author": "liruihuan",
"tags": ['Mongodb', 'Database', 'Query'],
"pages": 5,
"time" : ISODate("2017-04-09T11:42:39.736Z")
},{ "_id": ObjectId("58e1d2f0bb1bbc3245fa7571")
"title": "MongoDB Index",
"author": "liruihuan",
"tags": ['Mongodb', 'Index', 'Query'],
"pages": 3,
"time" : ISODate("2017-04-09T11:43:39.236Z")
},{ "_id": ObjectId("58e1d2f0bb1bbc3245fa7572")
"title": "MongoDB Query",
"author": "eryueyang",
"tags": ['Mongodb', 'Query'],
"pages": 8,
"time" : ISODate("2017-04-09T11:44:56.276Z")
}1.1.1、$project
作用
修改文档的结构,可以用来重命名、增加或删除文档中的字段。
范例1
只返回文档中 title 和 author 字段
>db.article.aggregate([{$project:{_id:0, title:1, author:1 }}]){ "title": "MongoDB Aggregate", "author": "liruihuan" },
{ "title": "MongoDB Index", "author": "liruihuan" },
{ "title": "MongoDB Query", "author": "eryueyang" }
|
因为字段 _id 是默认显示的,这里必须用 _id:0 把字段_id过滤掉。
范例2
把文档中 pages 字段的值都增加10。并重命名成 newPages 字段。
>db.article.aggregate( [
{
$project:{
_id:0,
title:1,
author:1,
newPages: {$add:["$Pages",10]}
}
}
]
){ "title": "MongoDB Aggregate", "author": "liruihuan", "newPages": 15 },
{ "title": "MongoDB Index",
|