基礎知識java
操做符介紹:sql
$project:包含、排除、重命名和顯示字段 $match:查詢,須要同find()同樣的參數 $limit:限制結果數量 $skip:忽略結果的數量 $sort:按照給定的字段排序結果 $group:按照給定表達式組合結果 $unwind:分割嵌入數組到本身頂層文件
$sum 總結從集合中的全部文件所定義的值. $avg 從全部文檔集合中全部給定值計算的平均. $min 獲取集合中的全部文件中的相應值最小. $max 獲取集合中的全部文件中的相應值的最大. $push 值插入到一個數組生成文檔中. $addToSet 值插入到一個數組中所獲得的文檔,但不會建立重複. $first 根據分組從源文檔中獲取的第一個文檔。一般狀況下,這纔有意義,連同之前的一些應用 「$sort」-stage. $last 根據分組從源文檔中獲取最後的文檔。一般,這纔有意義,連同之前的一些應用 「$sort」-stage.
文檔:MongoDB 官方aggregate說明。數組
相關使用:sqlserver
db.collection.aggregate([array]);server
array但是是任何一個或多個操做符。blog
group和match的用法,使用過sqlserver,group的用法很好理解,根據指定列進行分組統計,能夠統計分組的數量,也能統計分組中的和或者平均值等。排序
group以前的match,是對源數據進行查詢,group以後的match是對group以後的數據進行篩選;ip
同理,sort,skip,limit也是一樣的原理;文檔
{_id:1,name:"a",status:1,num:1} {_id:2,name:"a",status:0,num:2}
{_id:3,name:"b",status:1,num:3} {_id:4,name:"c",status:1,num:4} {_id:5,name:"d",status:1,num:5}
如下是示例:it
應用一:統計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後條件,是重點。