最近一直在用mongodb,有時候會須要用到統計,在網上查了一些資料,最適合用的就是用aggregate,如下介紹一下本身運用的心得。。sql
別人寫過的我就不過多描述了,你們一搜能搜索到N多同樣的,我寫一下個人總結。mongodb
基礎知識數組
請你們自行查找更多,如下是關鍵文檔。sqlserver
操做符介紹:spa
$project:包含、排除、重命名和顯示字段code
$match:查詢,須要同find()同樣的參數server
$limit:限制結果數量blog
$skip:忽略結果的數量排序
$sort:按照給定的字段排序結果ip
$group:按照給定表達式組合結果
$unwind:分割嵌入數組到本身頂層文件
相關使用:
db.collection.aggregate([array]);
array但是是任何一個或多個操做符。
group和match的用法,使用過sqlserver,group的用法很好理解,根據指定列進行分組統計,能夠統計分組的數量,也能統計分組中的和或者平均值等。
group以前的match,是對源數據進行查詢,group以後的match是對group以後的數據進行篩選;
同理,sort,skip,limit也是一樣的原理;
1 {_id:1,name:"a",status:1,num:1} 2 {_id:2,name:"a",status:0,num:2} 3 {_id:3,name:"b",status:1,num:3} 4 {_id:4,name:"c",status:1,num:4} 5 {_id:5,name:"d",status:1,num:5}
如下是示例:
應用一:統計name的數量和總數;
db.collection.aggregate([
{$group:{_id:"$name",count:{$sum:1},total:{$sum:"$num"}}
]);
應用二:統計status=1的name的數量;
db.collection.aggregate([
{$match:{status:1}},
{$group:{_id:"$name",count:{$sum:1}}}
]);
應用三:統計name的數量,而且數量爲小於2的;
db.collection.aggregate([
{$group:{_id:"$name",count:{$sum:1}},
{$match:{count:{$lt:2}}}
]);
應用四:統計stauts=1的name的數量,而且數量爲1的;
db.collection.aggregate([
{$match:{status:1}},
{$group:{_id:"$name",count:{$sum:1}}},
{$match:{count:1}}
]);
多列group,根據name和status進行多列
db.collection.aggregate([
{$group:{_id:{name:"$name",st:"$status"},count:{$sum:1}}}
]);
$project該操做符很簡單,
db.collection.aggregate([
{$project:{name:1,status:1}}
]);
結果是,只有_id,name,status三個字段的表數據,至關於sql表達式 select _id,name,status from collection
$unwind
這個操做符能夠將一個數組的文檔拆分爲多條文檔,在特殊條件下有用,本人暫沒有進行過多的研究。
以上基本就能夠實現大部分統計了,group前條件,group後條件,是重點。