Mongodb高階操作
阿新 • • 發佈:2020-11-03
練習資料
db.students.insert( [ {'_id':0, 'name': '小林', 'gender': '男', 'age': 20}, {'_id':1, 'name': '小黑', 'gender': '男', 'age': 20}, {'_id':2, 'name': '小白', 'gender': '男', 'age': 22}, {'_id':3, 'name': '小小林', 'gender': '女', 'age': 21}, {'_id':4, 'name': '小徐', 'gender': '女', 'age': 19}, {'_id':5, 'name': '小吳', 'gender': '女', 'age': 20}, {'_id':6, 'name': '小紅', 'gender': '女', 'age': 30}, {'_id':7, 'name': '小明', 'gender': '男', 'age': 20}, {'_id':8, 'name': '小林', 'gender': '男', 'age': 19}, {'_id':9, 'name': '小林', 'gender': '男', 'age': 20}, {'_id':10, 'name': '張小紅', 'gender': '女', 'age': 19}, ] )
插入資料
聚合 aggregate
聚合(aggregate)主要用於計算資料,類似sql中的sum()、avg()
語法
db.集合名稱.aggregate([{管道:{表示式}}])
管道
管道在Unix和Linux中一般用於將當前命令的輸出結果作為下一個命令的輸入
在mongodb中,管道具有同樣的作用,文件處理完畢後,通過管道進行下一次處理
常用管道
- $group:將集合中的文件分組,可用於統計結果
- $match:過濾資料,只輸出符合條件的文件
- $project:修改輸入文件的結構,如重新命名、增加、刪除欄位、建立計算結果
- $sort:將輸入文件排序後輸出
- $limit:限制聚合管道返回的文件數
- $skip:跳過指定數量的文件,並返回餘下的文件
- $unwind:將陣列型別的欄位進行拆分
表示式
處理輸入文件並輸出
常用表示式
- $sum:計算總和,$sum:1同count表示計數
- $avg:計算平均值
- $min:獲取最小值
- $max:獲取最大值
- $push:在結果文件中插入值到一個數組中
- $first:根據資源文件的排序獲取第一個文件資料
- $last:根據資源文件的排序獲取最後一個文件資料
$group
將集合中的文件分組,可用於統計結果
_id表示分組的依據,使用某欄位的格式為 $欄位
舉例:統計男生和女生的總人數
db.students.aggregate( [ {$group: { _id: "$gender", counter: {$sum: 1} } } ] )
將集合中所有文件分為一組,求學生總人數和平均年齡
db.students.aggregate( [ {$group: { _id: null, counter: {$sum: 1}, avgAge: {$avg: '$age'} } } ] )
統計學生性別和姓名
db.students.aggregate( [ {$group: { _id: '$gender', name: {$push: '$name'} } } ] )
使用$$ROOT可以將文件加入到結果集的陣列中
db.students.aggregate( [ {$group: { _id: '$gender', name: {$push: '$$ROOT'} } } ] ).pretty()
$match
用於過濾資料,只輸出符合條件的文件
舉例:查詢年齡大於20的學生
db.students.aggregate( [ {$match: {age:{$gt: 20}} } ] )
查詢年齡大於20的男生女生人數
db.students.aggregate( [ {$match: {age:{$gt: 20}}, }, {$group: { _id: '$gender', counter: {$sum: 1} } } ] )
$project
修改輸入文件的結構
舉例:查詢學生的姓名和年齡
db.students.aggregate( [ {$project: { _id: 0, name: 1, age: 1 } } ] )
查詢男生女生人數,並輸出人數
db.students.aggregate( [ {$group: { _id: '$gender', counter: {$sum: 1} } }, {$project: { _id: 1, counter: 1 } } ] )
$sort
將輸入文件排序後輸出
舉例:查詢學生資訊,按年齡升序
db.students.aggregate( [ {$sort: {age: 1} } ] )
查詢男生女生人數,按人數降序
db.students.aggregate( [ {$group: { _id: '$gender', counter: {$sum: 1} } }, {$sort: { counter: -1 } } ] )
$limit
限制聚合管道返回的文件數
舉例:查詢兩條學生資訊
db.students.aggregate( [ {$limit: 2} ] )
$skip
跳過指定數量的文件,並返回餘下文件
舉例:查詢從第三條開始的學生資訊
db.students.aggregate( [ {$skip: 2} ] )