日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

MongoDB高级操作(管道聚合)(mongodb的优缺点及应用场景)

發布時間:2023/12/15 综合教程 39 生活家
生活随笔 收集整理的這篇文章主要介紹了 MongoDB高级操作(管道聚合)(mongodb的优缺点及应用场景) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、 聚合aggregate
聚合(aggerate)主要用于計算數據,類似于SQL中的sum(),avg(),聚合aggregate是基于數據處理的聚合管道,每個文檔通過一個由多個階段(stage)組成的管道,可以對每個階段的管道進行分組、過濾等功能,然后經過一系列的處理,輸出相應的結果。
方法:db.stu.aggergate({管道:{表達式}}),如圖:

二、管道(grep)

  1. 在MongoDB中,文檔處理完畢后,通過管道進行下一次處理,常用管道如下:
$group:將集合中的文檔分組,可用于統計結果。
$match:過濾數據,只輸出符合條件的文檔。
$project:修改輸入文檔的結構,如重命名、增加、刪除字段、創建計算結果。
$sort:將輸入文檔排序后輸出。
$limit:限制聚合管道返回的文檔數。
$skip:跳過指定數量的文檔,并返回余下的文檔。
$unwind:將數組類型的字段進行拆分。

Jetbrains全家桶1年46,售后保障穩定

  1. 表達式
作用:處理輸入文檔并輸出。
常用表達式
$sum:計算總和,$sum:1同count表示計數
$avg: 計算平均值
$min: 獲取最小值
$max:獲取最大值
$push:在結果文檔中插入值到一個數組
$first:根據資源文檔的排序獲取第一個文檔數據
$last:根據資源文檔的排序獲取最后一個文檔的數據
  1. $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”}
  1. 透視數據
    例3:統計學生性別及學生姓名
db.stu.aggregate([
    { 
   $group:
        { 
   
            _id:'$gender',
            name:{ 
   $push:'$name'}
        }
    }
])
  1. 使用$$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}}
])
  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}}
])
  1. $sort
作用:將輸入文檔排序后輸出
例1:查詢學生信息,按年齡升序
db.stu.aggregate([{ 
   $sort:{ 
   age:1}}])
例2:查詢男生、女生人數,按人數降序
db.stu.aggregate([
    { 
   $group:{ 
   _id:'$gender',counter:{ 
   $sum:1}}},
    { 
   $sort:{ 
   counter:-1}}
])
  1. $limit
作用:限制聚合管道返回的文檔數
例1:查詢2條學生信息
db.stu.aggregate([{ 
   $limit:2}])
  1. $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。
  1. $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的优缺点及应用场景)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。