参见: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>},...]) 方法来构建和使用聚合管道。先看下官网给的实例,感受一下聚合管道的用法。

MongoDB 聚合管道

实例中,$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",  

相关文章: