MongoDB命令之聚合操作
同关系型数据库一样,MongoDB中聚合是其?级查询语?。其通过转化合并由多个?档的数据来?成新的在单个?档?不存在的?档信息。?般都是将记录按条件分组之后进??系列求最?值,最?值,平均值的简单操作,也可以对记录进?复杂数据统计,数据挖掘的操作。
聚合操作的输?是集中的?档,输出可以是?个?档也可以是多个?档。下面根据操作类型进行详细介绍:
一、单?的聚合操作(Single Purpose Aggregation Operation)
常?的命令有: count() 和 distinct()
二、聚合管道(Aggregation Pipeline)
MongoDB中聚合(aggregate)主要?于统计数据(诸如统计平均值,求和等),并返回计算后的数据结果。其使? db.COLLECTION_NAME.aggregate([{},...]) ?法来构建和使?聚合管道,每个?档通过?个由?个或者多个阶段(stage)组成的管道,?个管道处理完毕后将结果传递给下?个管道处理。管道操作是可以重复的,经过?系列的处理,输出相应的结果。(想想Linux/Unix命令中常使用的“|”)
聚合框架中常?的?个操作有:
$group:将集合中的?档分组,可?于统计结果。
$project:修改输??档的结构。可以?来重命名、增加或删除域,也可以?于创建计算结果以及嵌套?档。
$match:?于过滤数据,只输出符合条件的?档。 $match使?MongoDB的标准查询操作。
$limit:?来限制MongoDB聚合管道返回的?档数。
$skip:在聚合管道中跳过指定数量的?档,并返回余下的?档。
$sort:将输??档排序后输出。
$geoNear:输出接近某?地理位置的有序?档。
操作中使用的表达式可以有如下几种:
表达式的作用是处理输??档并输出,其只能?于计算当前聚合管道的?档,不能处理其它的?档。
三、MapReduce 编程模型
MapReduce是?种计算模型,简单的说就是将?批量的?作(数据)分解(MAP)执?,然后再将结果合并成最终结果(REDUCE)。
为什么要用MapReduce这种比较复杂的编程模型呢?实际上Pipeline查询速度确实快于MapReduce,但是MapReduce的强?之处在于能够在多台Server上并?执?复杂的聚合逻辑。 MongoDB不允许Pipeline的单个聚合操作占?过多的系统内存,如果?个聚合操作消耗20%以上的内存,那么MongoDB直接停?操作,并向客户端输出错误消息。
db.collection.mapReduce(
function() {emit(key,value);}, //map 函数是JavaScript 函数,负责将每?个输??档转换为零或多个?档,?成键值对序列,作为 reduce 函数参数
function(key,values) {return reduceFunction}, //reduce 函数是JavaScript 函数,对map操作的输出做合并的化简的操作(将key-values变成key-value,也就是把values数组变成?个单?的值value)
{
out: collection, //out:统计结果存放集合
query: document, //query: ?个筛选条件,只有满?条件的?档才会调?map函数。
sort: document, //sort: 和limit结合的sort排序参数(也是在发往map函数前给?档排序),可以优化分组机制
limit: number, //limit: 发往map函数的?档数量的上限(要是没有limit,单独使?sort的?处不?)
finalize:
verbose:
}
)
db.lf_resume_preview.mapReduce(
function() { emit(this.city,this.expectSalary); },
function(key, value) {return Array.avg(value)},
{
query:{expectSalary:{$gt: 15000}},
out:"cityAvgSal"
}
)