1. 程式人生 > >mongodb聚合命令

mongodb聚合命令

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聚合命令