MEAN-MongoDB aggregation(待填坑)
之前老师讲MongoDB的一个难点:aggregation,聚合,并提到几个关键词:pipeline,SIP单一原则。
官网上说聚合操作将来自多个文档的值组合在一起,并且可以对分组数据执行各种操作以返回单个结果。 MongoDB提供了三种执行聚合的方式:聚合管道,map-reduce功能和单用途聚合方法。并不是很好理解。
这篇博客上说的挺好:使用聚合框架可以对集合中的文档进行变换和组合。可以用多个构件创建一个管道,用于对一连串的文档进行处理。构件有:筛选、投射、分组、排序、限制和跳过。 MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理,管道操纵是可以重复的。
有了这个概念后,我们在回头看官网就好理解多了。首先pipeline 的概念
Aggregation Pipeline
MongoDB的聚合框架是基于数据处理pipeline的概念建模的。文档输入一个多级pipeline,目的是将文档转换为聚合结果。最基本的pipeline阶段提供了像查询和文档转换一样操作的过滤器,这些过滤器修改了输出文档的形式。其他pipeline操作提供了按特定字段或字段分组和排序文档的工具,以及用于汇总数组内容(包括文档数组)的工具。另外,pipeline阶段可以使用运算符执行任务,例如计算平均值或连接字符串。
这个图片很明了。
Map-Reduce
MongoDB还提供map-reduce操作来执行聚合。通常,map-reduce操作有两个阶段:1,处理每个文档并为每个输入文档映射一个或多个对象,2,减少组合map操作输出的阶段。map-reduce可以有一个finalize阶段来对结果进行最终修改。像其他聚合操作一样,map-reduce可以指定一个查询条件来选择输入文档以及对结果进行排序和限制。
和pipeline 相比,map-reduce 采用自定义JS和可选finalize,这使得它更灵活,但是效率会降低。
Single Purpose Aggregation Operations
MongoDB也提供了db.collection.count()和db.collection.distinct()。所有这些操作都汇总了单个集合中的文档。 虽然这些操作提供了对常见聚合流程的简单访问,但它们缺乏pipeline和map-reduce的灵活性和性能。
综上我们可以看出聚合的操作,一个是筛选文档,一个是改变文档的输出。
聚合管道的使用方式:db.collection.aggregate();
对于管道中的多个节点可以使用以下几种管道操作符
$project:修改文档的结构(重命名、增加或删除域),也可以用于创建计算结果以及嵌套文档。
$match:过滤数据,只输出符合条件的文档。
$limit:限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:文档排序输出。
$geoNear:输出接近某一地理位置的有序文档。
其实理解聚合的概念还是较为容易的,但是要真正的实现融会贯通,用起来能得心应手还是得多实践实践。