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