上一篇介紹了MongoDB增刪改查命令的基本用法,這一篇來學習一下MongoDB的一些基本聚合函數。
下面我們直奔主題,用簡單的實例依次介紹一下。
> count() 函數 |
集合的count函數是最簡單的聚合函數,返回集合中文檔的數量。
> distinct() 函數 |
用於找出一個集合中,給定鍵的所有不同的值。
我們還可通過在數據庫上運行命令,來執行distinct聚合函數,此時我們必須指定集合和鍵:
命令參數中,鍵"distinct"指定統計的集合名稱,鍵"key"指定統計的鍵的名稱!返回一個文檔,鍵“value”指定統計的鍵在該集合中的所有值!我們還可以看出,在統計時還使用了索引。
> group() 函數 |
group聚合可以實現稍微復雜一些的操作,其執行過程為:先按照指定的鍵對集合中的文檔進行分組,然后通過聚合每一組中的所有文檔,來產生最終的結果文檔。
下面對student集合中的age進行group,然后對每一組文檔進行處理,找出對應的name。
Key: 指定要進行分組所使用的鍵名。
Initial: 設置初始化值,針對分組后的每一組。
$reduce:函數,第一個參數是當前的文檔對象,第二個參數是文檔循環的累加。根據所需的條件對每個分組進行聚合操作,每一組會有一個獨立的累加器文檔,記錄聚合結果。
我們還可通過在數據庫上運行命令
"ns": 指定集合名。
以上是對集合所有記錄進行分組操作,當然還可以根據某些條件來進行分組。下面我們對name是jack,lucy,james的進行分組。
這里我們看到通過condition條件過濾,只對名字是jack,lucy,james的文檔進行分組,condition這里可以使用縮寫cond或者q。
另外我們看到還有一個參數finalize,這個參數目的是對$reduce聚合后的結果再次進行處理,最終得到所需的結果。
> MapReduce 函數 |
MapReduce是聚合里最復雜的,也是最靈活的,count,distince,group能做到的,它都能做到。
map:映射函數,將操作映射到集合中的每一個文檔,集合會按照你指定的key進行映射分組。使用函數emit(key,value)
reduce:化簡函數,會對map分組后的數據進行分組簡化,直到每個鍵的列表只有一個值為止,返回結果集。
mapReduce: 最后執行函數,參數為map,reduce。
概念不好理解,看下實例就很明白了。
從這個實例可以看出,map使用 使用函數emit(key,value),根據name鍵進行映射分組,每個鍵對應數組{count:1}的鍵值。
然后reduce函數根據每個鍵所對應的鍵值進行相應操作。最終得到所需的結果集。
最后mapReduce函數輸出這個結果集。
下面我們看看這個結果集的值。
常用的聚合函數使用就介紹到這里,下一篇學習一下索引的一些基本用法。