聚合主要用於計算數據,相似sql中的sum()、avg()sql
語法:mongodb
db.集合名稱.aggregate([{管道:{表達式}}])
stu準備的數據:數組
db.stu.insertMany([ { name: "gj",gender:true, age: 18}, { name: "gj1",gender:true, age: 28}, { name: "hr",gender:false, age: 18}, { name: "hr1",gender:false, age: 28} ])
管道在Unix和Linux中通常用於將當前命令的輸出結果做爲下一個命令的輸入。學習
ps ajx | grep mongo
在mongodb中,管道具備一樣的做用,文檔處理完畢後,經過管道進行下一次處理。spa
經常使用管道:3d
$group:將集合中的文檔分組,可用於統計結果。code
$match:用於過濾數據,只輸出符合條件的文檔。$match使用MongoDB的標準查詢操做。blog
$project:修改輸入文檔的結構。能夠用來重命名、增長或刪除域,也能夠用於建立計算結果以及嵌套文檔。排序
$sort:將輸入文檔排序後輸出。ip
$limit:用來限制MongoDB聚合管道返回的文檔數。
$skip:在聚合管道中跳過指定數量的文檔,並返回餘下的文檔。
$unwind:將文檔中的某一個數組類型字段拆分紅多條,每條包含數組中的一個值。
$geoNear:輸出接近某一地理位置的有序文檔。
處理輸入文檔並輸出。
語法:
表達式:'$列名'
經常使用表達式:
$sum:計算總和,$sum:同count表示計數
$avg:計算平均值
$min:獲取最小值
$max:獲取最大值
$push:在結果文檔中插入一個數組中,數組內容爲選中字段
$first:根據資源文檔的排序獲取第一個文檔數據
$last:根據資源文檔的排序獲取最後一個文檔數據
將集合中的文檔分組,可用於統計結果。
_id表示分組的依據,使用某個字段的格式爲‘$字段’
實例:
統計男生、女生的總人數:
db.stu.aggregate([ {$group:{_id:'gender',counter:{$sum:1}}} ])
統計學生性別及學生姓名:
db.stu.aggregate([ {$group:{_id:'gender',counter:{$push:'$name'}}} ])
使用$$ROOT能夠將文檔內容加入到結果集的數組中:
db.stu.aggregate([ {$group:{_id:'gender',name:{$push:'$$ROOT'}}} ])
將集合中全部文檔分爲一組。
求學生總人數、平均年齡:
db.stu.aggregate([ {$group:{_id:null,counter:{$sum:1},avgAge:{$avg:'$age'}}} ])
用於過濾數據,只輸出符合條件的文檔。
使用MongoDB的標準查詢操做。
實例:
查詢年齡大於20的學生:
db.stu.aggregate([ {$match:{age:{$gt:20}}} ])
查詢年齡大於20的男生、女生人數。
db.stu.aggregate([ {$match:{age:{$gt:20}}}, {$group:{_id:'$gender',counter:{$sum:1}}} ])
修改輸入文檔的結構,如重命名、增長、刪除字段、建立計算結果。
實例:
查詢學生的姓名、年齡。
db.stu.aggregate([ {$project:{_id:0,name:1,age:1}} ])
查詢男生、女生人數,輸出人數。
db.stu.aggregate([ {$group:{_id:'$gender',counter:{$sum:1}}}, {$project:{_id:0,counter:1}} ])
將輸入文檔排序後輸出。
實例:
查詢學生學習,按年齡升序。
db.stu.aggregate([ {$sort:{age:1}} ])
查詢男生、女生人數,按人數降序。
db.stu.aggregate([ {$group:{_id:'$gender',counter:{$sum:1}}}, {$sort:{counter:-1}} ])
限制聚合管道返回的文檔數。
查詢2條學生信息。
db.stu.aggregate([ {$limit:2} ])
跳過指定數量的文檔,並返回餘下的文檔。
查詢從第3條開始的學生信息。
db.stu.aggregate([ {$skip:2} ])
統計男生、女生人數,按人數升序,取第二條數據。
db.stu.aggregate([ {$group:{_id:'$gender',counter:{$sum:1}}}, {$sort:{counter:1}}, {$skip:1}, {$limit:1} ])
注意順序:先寫skip,再寫limit。
將文檔中的某一個數組類型字段拆分紅多條,每條包含數組中的一個值。
語法1:
對某字段值進行拆分。
db.集合名稱.aggregate([{$unwind:'$字段名稱'}])
構造數據:
db.t2.insert({_id:1,title:'t-shirt',size:['M','L','S']})
查詢:
db.t2.aggregate([{$unwind:'$size'}])
語法2:
對某字段值進行拆分。
處理空數組、非數組、無字段、null狀況。
db.集合名稱.aggregate([{ $unwind:{ path:'$字段名稱', preserveNullAndEmptyArrays:<boolean> #防止數據丟失 }])
構造數據:
db.t3.insert([ {_id:1,"item":"a",size:["M","L","S"]}, {_id:2,"item":"b",size:[]}, {_id:3,"item":"c",size:"M"}, {_id:4,"item":"d"}, {_id:5,"item":"e",size:null} ])
使用語法1查詢:
db.t3.aggregate([{$unwind:'$size'}])
使用語法2查詢 :
db.t3.aggregate([ {$unwind:{path:'$size',preserveNullAndEmptyArrays:true}} ])