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