MongoDB高級一點點的操做

在MongoDB數據庫中常見的聚合操做有:count,distinct,group,mapReduce。如今將它們一一的記錄下來:數據庫

1、count操做編程

這個操做顧名思義就是達到統計的效果啦,用來統計符合某一種查詢條件的總數。
數組

/** 統計全部記錄的總數 */
db.user.count()

/** 統計名字爲 hanmeimei 的記錄數 */
db.user.count({"name":"hanmeimei"})

2、distinct操做分佈式

在SQL中這個單詞的做用是去除重複的意思,在NoSQL數據庫中也能夠達到一樣的效果。函數

/** 去除重複的年齡 */
db.person.distinct("age")

3、group操做oop

在關係型數據庫中,group表示的是分租,在noSQL數據庫中也是表示一樣的意思,可是它的操做會比較麻煩一些。歸根到底,group的操做就是造成了一種「k-v」模型。this

 /** 按照年齡 age 來進行分組 而後將name放在user裏面 */
 
 > db.person.group({"key":{"age":true},"initial":{"user":[]},"$reduce":function(cur,prev){prev.user.push(cur.name);}})

  key:  這個就是分組的key,咱們這裏是對年齡分組。spa

  initial: 每組都分享一個」初始化函數「,特別注意:是每一組,好比這個的age=20的value的list分享一個initial函數,age=22一樣也分享一個initial函數。code

  $reduce: 這個函數的第一個參數是當前的文檔對象,第二個參數是上一次function操做的累計對象,第一次爲initial中的{」perosn「:[]}。有多少個文檔, $reduce就會調用多少次。對象

 /** 按照年齡 age 來進行分組 同時要求年齡大於21歲,而且統計每一組查詢出來的記錄條數*/
 > db.person.group({"key":{"age":true},"initial":{"user":[]},"$reduce":function(cur,prev){prev.user.push(cur.name);},"finalize":function(out){out.count=out.user.length},"condition":{"age":{$gt:21}}})

 condition:  這個就是過濾條件。

 finalize:這是個函數,每一組文檔執行完後,多會觸發此方法,那麼在每組集合裏面加上count也就是它的活了。


4、mapReduce操做

mapReduce操做是MongoDB聚合操做中最複雜的操做,同時它也是最靈活。 mapReduce實際上是一種編程模型,用在分佈式計算中,其中有一個「map」函數,一個」reduce「函數。mapReduce是hadoop的核心之一。

   一、 map:

          這個稱爲映射函數,裏面會調用emit(key,value),集合會按照你指定的key進行映射分組。

   二、 reduce:

         這個稱爲簡化函數,會對map分組後的數據進行分組簡化,注意:在reduce(key,value)中的key就是 emit中的key,vlaue爲emit分組後的emit(value)的集合,這裏也就是不少{"count":1}的數組。

   三、 mapReduce:

          這個就是最後執行的函數了,參數爲map,reduce和一些可選參數

/** map 函數 */
var map=function(){ emit(this.name,{count:1})}

/** reduce 函數 */
 var reduce = function(key,value){var result = {count:0};for(var i = 0;i<value.length;i++){result.count += value[i].count;} return result}
 
/** mapReduce 操做 */
db.person.mapReduce(map,reduce,{"out":"collection"})

從圖中咱們能夠看到以下信息:

       result: "存放的集合名「;

       input:傳入文檔的個數。

       emit:此函數被調用的次數。

       reduce:此函數被調用的次數。

       output:最後返回文檔的個數。

同時咱們也能夠看看最後根據name分組的結果:

這些都是MongoDB中經常使用的聚合操做了。

相關文章
相關標籤/搜索