標籤:mongodb 彙總資料 文檔 sql
MongoDB除了基本的查詢功能,還提供了很多強大的彙總工具。
count
和SQL中類似,用來統計集合中的文檔數量總和:
不管集合有多大,count都能夠快速的返迴文檔數量。
可以添加篩選條件,但需要犧牲查詢效能:
db.lf.count({"name":"rrrr"})
distinct
用來找出給定鍵的所有不同值,使用時必須指定集合和鍵:
group
group會促使MongoDB將集合依據選定索引值的不同分成若干組,然後通過彙總每一組內的文檔,產生一個結果文檔。講的有點模糊?看下面的例子:
db.runCommand({ "group": { "ns":"lf", "key":{"name":true}, "initial":{"count":0}, "$reduce":function(doc,prev) { prev.count++; }, "condition":{"age":{"$gt":20}} }})
通過ns指定要分組的集合:
"ns":"lf",
通過key完成文檔分組的依據:
"key":{"name":true},
這裡說明所有name鍵的值相同的文檔會被劃分到一組,true代表會返回鍵name的值。
initial代表初始化,可以用來設定累加器變數
"initial":{"count":0},
$reduce表示函數調用
"$reduce":function(doc,prev){...}
condition用來存放篩選條件:
"condition":{"age":{"$gt":20}}
最後執行結果為:
finalize
下面介紹一下完成器finalize,完成器用於精簡從資料庫傳到使用者的資料,也就是說,可以針對查詢結果進一步過濾:
db.runCommand( { "group": { "ns":"lf", "key":{"name":true}, "initial":{"count":0}, "$reduce":function(doc,prev) { prev.count++; }, "finalize":function(doc) { doc.num=doc.count; delete doc.count; } } })
finalize能夠修改傳遞的參數,也能夠返回新值,結果如下:
$keyf
有些時候分組所依據的條件很複雜,不僅是一個鍵.比如要使用group計算每個類別有多篇部落格文章.由於有很多作者,給文章分類時可能不規律的使用了大小寫。
所以,如果要是按類別名來分組,最後”MongoDB”和”mongodb”就是不同的組.為了消除這種大小寫影響,就要定義一個函數來確定文檔所依據的鍵。定義分組要用到$keyf:
db.runCommand( { "group": { "ns":"lf", "$keyf":function(doc){return {"name":doc.username.toLowerCase()}}, "initial":{"count":0}, "$reduce":function(doc,prev) { prev.count++; } } })
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
MongoDB之彙總