MongoDB高级操作(管道聚合)(mongodb的优缺点及应用场景)
生活随笔
收集整理的這篇文章主要介紹了
MongoDB高级操作(管道聚合)(mongodb的优缺点及应用场景)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、 聚合aggregate
聚合(aggerate)主要用于計算數據,類似于SQL中的sum(),avg(),聚合aggregate是基于數據處理的聚合管道,每個文檔通過一個由多個階段(stage)組成的管道,可以對每個階段的管道進行分組、過濾等功能,然后經過一系列的處理,輸出相應的結果。
方法:db.stu.aggergate({管道:{表達式}}),如圖:
二、管道(grep)
- 在MongoDB中,文檔處理完畢后,通過管道進行下一次處理,常用管道如下:
$group:將集合中的文檔分組,可用于統計結果。
$match:過濾數據,只輸出符合條件的文檔。
$project:修改輸入文檔的結構,如重命名、增加、刪除字段、創建計算結果。
$sort:將輸入文檔排序后輸出。
$limit:限制聚合管道返回的文檔數。
$skip:跳過指定數量的文檔,并返回余下的文檔。
$unwind:將數組類型的字段進行拆分。
Jetbrains全家桶1年46,售后保障穩定
- 表達式
作用:處理輸入文檔并輸出。
常用表達式
$sum:計算總和,$sum:1同count表示計數
$avg: 計算平均值
$min: 獲取最小值
$max:獲取最大值
$push:在結果文檔中插入值到一個數組
$first:根據資源文檔的排序獲取第一個文檔數據
$last:根據資源文檔的排序獲取最后一個文檔的數據
- $group
作用:將集合中的文檔分組,可用于統計結果。其中,_id表示分組的依據,使用某個字段的1格式為”$字段”。
$group注意點:
1、分組需要放在“_id”后面
2、對應的字典中有幾個鍵,結果就有幾個鍵
3、取不同字段的值需要使用”$age”,”$gender’
4、取字典嵌套的字典中的值時,$_id.country
6、能夠按照多個鍵進行分組{
$group:{
_id:{
country:”$country”, province:"$province"}}},
結果是:{
_id:{
country:”值”,provice:”值”}}
例如:統計男生、女生的總人數
db.stu.aggregate([
{
$group:
{
_id:'$gender',
counter:{
$sum:1}
}
}
])
將集合所有文檔分為一組(Group by null)
例2:求學生總人數、平均年齡
db.stu.aggregate([
{
$group:
{
_id:null,
counter:{
$sum:1},
avgAge:{
$avg:'$age'}
}
}
])
例3:統計出每個country/provice下的userid的數量(同一個userid只能統計一次)
db.stu.aggregate(
{
$group:{
_id:{
country:”$country”,province:”$province”,userid:”$userid”}}},
{
$group:{
_id:{
country:”$_id.country”,province:”$_id.province”},count:{
$sum:1}}},
{
$project:{
country:”$_id.country”,province:”$_id.province”,count:1,_id:0}}
)
結果:{
“count”:3,”country”:”china”,”province”:”sh”}
{
“count”:2,”country”:”china”,”province”:”bj”}
- 透視數據
例3:統計學生性別及學生姓名
db.stu.aggregate([
{
$group:
{
_id:'$gender',
name:{
$push:'$name'}
}
}
])
- 使用$$ROOT可以將文檔內容加到結果集中,代碼如下:
db.stu.aggregate([
{
$group:
{
_id:'$gender',
name:{
$push:'$$ROOT'}
}
}
])
6)$match
作用:用于過濾數據,只輸出符合條件的文檔,是MongoDB的標準查詢操作。
問:為什么不用find?
答:Match是管道命令,用于對上一個管道的結果進行篩選,能將結果交給后一個管道,但是find不可以
例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:{
_id:0,gender:”$_id”,count: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:查詢學生信息,按年齡升序
db.stu.aggregate([{
$sort:{
age:1}}])
例2:查詢男生、女生人數,按人數降序
db.stu.aggregate([
{
$group:{
_id:'$gender',counter:{
$sum:1}}},
{
$sort:{
counter:-1}}
])
- $limit
作用:限制聚合管道返回的文檔數
例1:查詢2條學生信息
db.stu.aggregate([{
$limit:2}])
- $skip
作用:跳過指定數量的文檔,并返回余下的文檔
例2:查詢從第三條開始的學生信息
db.stu.aggregate([{
$skip:2}])
例3:統計男生、女生人數,按人數升序,取第二條數據
db.stu.aggeregate(
{
$group:{
_id:”$gender”,count:{
$sum:1}}},
{
$sort:{
count:1}},
{
$skip:1},
{
$limit:1}
)
注意順序:先寫skip,再寫limit。
- $unwind
將文檔中某一個數組類型字段拆分成多條,每條包含數組中的一個值,屬性值為false表示丟棄屬性值為空的文檔,
屬性值preserveNullAndEmptyArrays值為true表示保留屬性值為空的文檔。
操作:
db.stu.aggergate({
$unwind:{
path:”$字段名稱”,
preserveNullAndEmptyArrays:<boolean>#防止數據丟失
}
})
語法1:對某字段進行拆分:db.stu.aggregate({
$unwind:'$字段名稱'})
示例操作
構造數據:db.stu.insert({
_id:1,item:'t-shirt',size:['S','M','L']})
查詢:db.stu.aggregate({
\$unwind:'$size'})
語法2:
對某字段值進行拆分,處理空數組、非數組、無子段、null情況
db.inventory.aggregate([{
$unwind:{
path:'$字段名稱',
preserveNullAndEmptyArrays:<boolean>#防止數據丟失
}
}])
構造數據
db.t3.insert([
{
"_id" : 1, "item" : "a", "size": [ "S", "M", "L"] },
{
"_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'}])
疑問:查看查詢結果,發現對于空數組、無字段、null的文檔,都被丟棄了
問:如何能不丟棄呢?
答:使用語法2查詢
db.t3.aggregate([{
$unwind:{
path:'$sizes',preserveNullAndEmptyArrays:true}}])
總結
以上是生活随笔為你收集整理的MongoDB高级操作(管道聚合)(mongodb的优缺点及应用场景)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Adobe air 安装软件解析
- 下一篇: 如何打包和部署air应用程序