在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中經常使用的聚合操做了。