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: