1. 聚合aggregate
聚合主要用于計算資料,類似sql中的sum()、avg()
語法:
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} ])

1.1 管道
管道在Unix和Linux中一般用于將當前命令的輸出結果作為下一個命令的輸入,
ps ajx | grep mongo
在mongodb中,管道具有同樣的作用,檔案處理完畢后,通過管道進行下一次處理,
常用管道:
$group:將集合中的檔案分組,可用于統計結果,
$match:用于過濾資料,只輸出符合條件的檔案,$match使用MongoDB的標準查詢操作,
$project:修改輸入檔案的結構,可以用來重命名、增加或洗掉域,也可以用于創建計算結果以及嵌套檔案,
$sort:將輸入檔案排序后輸出,
$limit:用來限制MongoDB聚合管道回傳的檔案數,
$skip:在聚合管道中跳過指定數量的檔案,并回傳余下的檔案,
$unwind:將檔案中的某一個陣列型別欄位拆分成多條,每條包含陣列中的一個值,
$geoNear:輸出接近某一地理位置的有序檔案,
1.2 運算式
處理輸入檔案并輸出,
語法:
運算式:'$列名'
常用運算式:
$sum:計算總和,$sum:同count表示計數
$avg:計算平均值
$min:獲取最小值
$max:獲取最大值
$push:在結果檔案中插入一個陣列中,陣列內容為選中欄位
$first:根據資源檔案的排序獲取第一個檔案資料
$last:根據資源檔案的排序獲取最后一個檔案資料
1.3 $group
將集合中的檔案分組,可用于統計結果,
_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'}}} ])

1.4 $match
用于過濾資料,只輸出符合條件的檔案,
使用MongoDB的標準查詢操作,
實體:
查詢年齡大于20的學生:
db.stu.aggregate([ {$match:{age:{$gt:20}}} ])

查詢年齡大于20的男生、女生人數,
db.stu.aggregate([ {$match:{age:{$gt:20}}}, {$group:{_id:'$gender',counter:{$sum:1}}} ])

1.5 $project
修改輸入檔案的結構,如重命名、增加、洗掉欄位、創建計算結果,
實體:
查詢學生的姓名、年齡,
db.stu.aggregate([ {$project:{_id:0,name:1,age:1}} ])

查詢男生、女生人數,輸出人數,
db.stu.aggregate([ {$group:{_id:'$gender',counter:{$sum:1}}}, {$project:{_id:0,counter:1}} ])

1.6 $sort
將輸入檔案排序后輸出,
實體:
查詢學生學習,按年齡升序,
db.stu.aggregate([ {$sort:{age:1}} ])

查詢男生、女生人數,按人數降序,
db.stu.aggregate([ {$group:{_id:'$gender',counter:{$sum:1}}}, {$sort:{counter:-1}} ])

1.7 $limit
限制聚合管道回傳的檔案數,
查詢2條學生資訊,
db.stu.aggregate([ {$limit:2} ])

1.8 $skip
跳過指定數量的檔案,并回傳余下的檔案,
查詢從第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.9 $unwind
將檔案中的某一個陣列型別欄位拆分成多條,每條包含陣列中的一個值,
語法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}} ])

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/26222.html
標籤:NoSQL
下一篇:MongoDB(八):索引
