MongoDB aggregate做統計資料(group進階)。

孤芳不自賞發表於2017-08-30

最近一直在用mongodb,有時候會需要用到統計,在網上查了一些資料,最適合用的就是用aggregate,以下介紹一下自己運用的心得。。

別人寫過的我就不過多描述了,大家一搜能搜尋到N多一樣的,我寫一下我的總結。

 

基礎知識

請大家自行查詢更多,以下是關鍵文件。

操作符介紹:

$project:包含、排除、重新命名和顯示欄位

$match:查詢,需要同find()一樣的引數

$limit:限制結果數量

$skip:忽略結果的數量

$sort:按照給定的欄位排序結果

$group:按照給定表示式組合結果

$unwind:分割嵌入陣列到自己頂層檔案

 

文件:MongoDB 官方aggregate說明

 

相關使用:

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後條件,是重點。


轉載:http://www.cnblogs.com/fycayy/p/3850973.html?utm_source=tuicool&utm_medium=referral

相關文章