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:输出接近某⼀地理位置的有序⽂档。
    操作中使用的表达式可以有如下几种:
      

    表达式的作用是处理输⼊⽂档并输出,其只能⽤于计算当前聚合管道的⽂档,不能处理其它的⽂档。

      

    对于其他操作stage可以查看MongoDB的Reference中相关内容Aggregation Pipeline Stages — MongoDB Manual,同时官网也提供了stage与SQL的对比图SQL to Aggregation Mapping Chart — MongoDB Manual,如下:

      

  三、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: <function>,    //finalize:可以对reduce输出结果再⼀次修改
          verbose: <boolean>    //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"
        }
      )

       

 

 

 

 



  

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM