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: ,    //finalize:可以对reduce输出结果再?次修改
          verbose:     //verbose:是否包括结果信息中的时间信息,默认为fasle
        }
      )

      db.lf_resume_preview.mapReduce(
        function() { emit(this.city,this.expectSalary); },
        function(key, value) {return Array.avg(value)},
        {
          query:{expectSalary:{$gt: 15000}},
          out:"cityAvgSal"
        }
      )