mongodb聚合命令
阿新 • • 發佈:2018-10-28
min _id 過濾 and operator 最小值 clas 屬性 結構
聚合aggregate
聚合(aggregate)是基於數據處理的聚合管道,每個文檔通過一個由多個階段(stage)組成管道,可以對每個階段的管道進行分組、過濾等功能,然後經過一系列的處理,輸出相應的結果。
db.集合名稱.aggregate({管道:{表達式}})
常用管道
在mongodb中,文檔處理完畢後,通過管道進行下一次處理
常用管道如下:
$group:將集合中的文檔分組,可以用於統計結果
$match:過濾數據,只輸出符合條件的文檔
$project:修改輸入文檔的結構,如重命名、增加、刪除字段、創建計算結果
$sort:將輸入文檔排序後輸出
$limit:限制聚合管道返回的文檔數
$skip:跳過指定數量的文檔,並返回余下的文檔
$unwind:將數組類型的字段進行拆分
表達式
處理輸入文檔並輸出
語法:表達式:‘$列名‘
常用表達式:
$sum:計算總和,$sum:1表示以一倍計數
$avg:計算平均值
$min:獲取最小值
$max:獲取最大值
$push:在結果文檔中插入值到一個數組中
$first:根據資源文檔的排序獲取第一個文檔數據
$last:根據資源文檔的排序獲取最後一個文檔數據
$group
- 將集合的文檔分組,可用於統計結果
- _id表示分組的依據,使用某個字段的格式為‘$字段‘
- 例1:統計男生、女生的總人數
db.stu.aggregate( {$group: { _id:‘$gender‘, counter:{$sum:1} } } )
group文檔:https://docs.mongodb.com/manual/reference/operator/aggregation/group/
group by null
- 將集合中所有文檔分為一組
- 例2:求學生總人數、平均年齡
db.stu.aggregate(
{$group:
{
_id:null,
counter:{$sum:1},
avgAge:{$avg:‘$age‘}
}
}
)
$match
- 用於過濾數據,只輸出符合條件的文檔
- 使用MangoDB的標準查詢操作
- 例1:查詢年齡大於20的學生
db.stu.aggregate(
{$match:{age:{$gt:20}}}
)
- 例2:查詢年齡大於20的男生、女生人數
db.stu.aggregate(
{$match:{age:{$gt:20}}},
{$group:
{_id:‘$gender‘,counter:{$sum:1}
}}
)
$project
- 修改輸入文檔的結構,如重命名、增加、刪除字段、創建計算結果
- 例1:查詢學生的姓名、年齡
db.stu.aggregate(
{$project:{_id:0,name:1,age:1}}
)
- 例2:查詢男生、女生人數、輸出人數
db.stu.aggregate(
{$group:{_id:‘$gender‘,counter:{$sum:1}}}
{$project:{_id:0,counter:1}}
)
$sort
- 將輸入文檔排序後輸出
- 例1:查詢學生信息,按年齡升序
b.stu.aggregate({$sort:{age:1}})
- 例2:查詢男生、女生人數,按人數降序
db.stu.aggregate(
{$group:{_id:‘$gender‘,counter:{$sum:1}}}
{$sort:{counter:-1}}
)
$limit和$skip
$limit
- 限制聚合管道返回的文檔數
- 例1:查詢2條學生信息
db.stu.aggregate({$limit:2})
skip
- 跳過指定數量的文檔,並返回余下的文檔
- 例2:查詢從第3條開始的學生信息
db.stu.aggregate({$skip:2})
- 例3:統計男生、女生人數,按人數升序,取第二條數據
db.stu.aggregate(
{$group:{_id:‘$gender‘, counter:{$sum:1}}},
{$sort:{counter:1}},
{$skip:1},
{$limit:1}
)
- 註意順序:先寫skip,再寫limit
$unwind
將文檔中的某一個數組類型字段拆分成多條,每條包含數組中的一個值
語法:db.集合名稱.aggregate({$unwind:$字段名稱})
db.t2.insert({_id:1,item:‘t-shirt‘,size:[‘S‘,‘M‘,‘L‘]})
db.t2.aggregate({$unwind:‘$size‘})
結果如下:
{"_id":1,"item":"t-shirt","size":"S"}
{"_id":1,"item":"t-shirt","size":"M"}
{"_id":1,"item":"t-shirt","size":"L"}
屬性值為false表示丟棄屬性值為空的文檔
屬性preserveNullAndEmptyArrys值為true表示保留屬性值為空的文檔
用法:
db.inventory.aggregate(
$unwind:{
path:‘$字段名稱‘,
preserveNullAndEmptyArrays:<boolean> # 防止數據丟失
}
)
mongodb聚合命令