python| MongoDB聚合(count、distinct、group、MapReduce)


1. count:返回集合中文檔的數量。

db.friend.count()

db.friend.count({'age':24})

增加查詢條件會使count查詢變慢。

 

2. distinct:找出給定鍵的所有不同的值。

使用時必須指定集合和鍵:

db.runCommand({'distinct':'friend','key':'age'}),返回一個文檔,'value'鍵的值就是這個'age'鍵的所有不同值組成的數組。

或:

db.friend.distinct('age'),直接返回'age'鍵的所有不同值組成的數組。

 

3. group:分組統計。

示例:找出相同年齡(age)中,積分(score)最高的人。

參數說明:

ns:指定要進行分組的集合。

key:指定文檔分組依據的鍵,鍵值相同的所有文檔分為一組。

initial:每一組reduce函數調用時作為第二個參數傳遞給reduce函數的初始文檔,每一組的所有成員都會使用這個累加器,所以改變會被保留住。

$reduce:每個文檔都對應一次這個調用,兩個參數分別是當前文檔和累加器文檔(本組當前的結果)。每一組都有一個獨立的累加器存儲本分組的結果。

condition:只處理滿足條件的文檔。

finalize:函數,完成器,在每組結果傳遞到客戶端之前被調用一次,用以精簡從數據庫傳到用戶的數據。

例如,在上面的例子中可以在group中加入finalize參數來去除結果中的’age’鍵:

‘finalize’: function(prev) {

        delete prev.age;

}

(參數prev是每個分組結果文檔)

$keyf:將函數作為鍵使用,用作分組依據。當分組依據變得復雜,不再只是一個簡單的鍵值那么簡單的時候,’key’參數已經無法滿足需求,此時可以使用’$keyf’參數,它可以依據各種復雜的條件進行分組。

使用場景之一:依據分組鍵值進行分組,但忽略大小寫。

‘$keyf’: function(x) {

         return {‘name’:x.name.toLowerCase()};

}

(參數x表示當前文檔對象,返回值一定要是一個對象,對象的鍵即是分組鍵。group中不能同時包含key參數和$keyf參數)

注意:分組依據鍵不存在的文檔會被分到一組,並顯示鍵值為null,可以在condition參數中加入{‘$exists’:true}來去掉這一組。

 

4. MapReduce:

使用MapReduce的代價就是速度慢,不能用在“實時”環境中。要作為后台任務來運行MapReduce,創建一個保存結果的集合,然后對這個集合進行實時查詢。

示例:找出集合中的所有鍵。

參數說明:

mapreduce:字符串,指定需要進行MapReduce操作的集合的名稱。

map:函數,分組函數,將集合中的文檔根據某個鍵的值進行分組(一個文檔調用一次)。

reduce:函數,每個分組的處理函數(一個分組調用一次)。

在以上例子中,執行完map函數之后,傳遞給reduce函數的參數格式類似:key為’age’,emits為[{‘count’:1},{‘count’:1},{‘count’:1}...]。

最終產生的結果集中”_id”鍵值為分組key的鍵值,”value”則是reduce函數返回的內容,目前reduce函數不支持返回數組,會報錯:multiple not supported yet。

finalize:函數,處理reduce調用之后產生的結果,MapReduce的最后一步(一般用於清除多余信息)。

keeptemp:布爾,連接關閉時臨時結果集合是否保存。

out:字符串,結果集名稱,設置該項則隱含着keeptemp:true。不指定’out’參數會報錯:’out’ has to be a string or an object。

query:文檔,發往map函數前先使用指定條件過濾文檔。

sort:文檔,發往map函數前先給文檔排序。

limit:整數,發往map函數的文檔數量的上限。

scope:文檔,JavaScript代碼中要用到的變量。

scope是MapReduce的作用域鍵,可以使用“變量名:值”這樣的普通文檔來設置該選項,然后在map、reduce和finalize函數中就能使用了。

verbose:布爾,是否產生更加詳細的服務器日志。(查看MapReduce的運行過程,也可以用print把map、reduce、finalize過程中的信息輸出到服務器日志上。)

每個傳遞給map函數的文檔都要事先反序列化,從BSON轉換成JavaScript對象,這個過程非常耗資源。要是事先能確定只對集合的一部分文檔執行MapReduce,使用query、sort、limit來增加一層過濾層會極大地提高速度。可以在MapReduce操作產生的結果集合上再進行MapReduce操作!

Group的結果集有4MB的大小限制,MapReduce則沒有這個限制。

 

group和MapReduce對比示例:查詢相同年齡人的名字。

(1)group:

(2)MapReduce:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM