mongo聚合框架aggregate使用

你笑的像一條狗發表於2018-12-15

mongo聚合框架aggregate使用

資料

db.emps.insert({"name":"張三","age":30,"sex":"男","job":"CLERK","salary":1000}) db.emps.insert({"name":"李四","age":28,"sex":"女","job":"CLERK","salary":2000}) db.emps.insert({"name":"王五","age":26,"sex":"男","job":"MANAGER","salary":5000}) db.emps.insert({"name":"趙六","age":32,"sex":"女","job":"MANAGER","salary":6000}) db.emps.insert({"name":"孫七","age":31,"sex":"男","job":"CLERK","salary":4000}) db.emps.insert({"name":"王八","age":35,"sex":"女","job":"PRESIDENT","salary":7000})

查詢

db.emps.find()
複製程式碼

1.png

$group

主要進行分的資料操作查詢

實現 聚合查詢的功能

 db.emps.aggregate([{"$group":{"_id":"$job",j_count:{"$sum":1}}}]) //每個職位的人員數量 相當於group by
複製程式碼

// 1 { "_id": "MANAGER", "j_count": 4 }

// 2 { "_id": "PRESIDENT", "j_count": 3 }

// 3 { "_id": "CLERK", "j_count": 7 }

格式 : [] 裡面 , 第一個 欄位 _id 表示要操作的內容 , 之後跟著要做的事情(統計)

求出每個職位的總工資 _

db.emps.aggregate([{"$group":{"_id":"$job",job_salary:{"$sum":"$salary"}}}])
複製程式碼

// 1 { "_id": "MANAGER", "job_salary": 22000 }

// 2 { "_id": "PRESIDENT", "job_salary": 21000 }

// 3 { "_id": "CLERK", "job_salary": 18000 }

$salary

引用每行的資料 使用 $欄位名

求出每個職位的平均工資
 db.emps.aggregate([{"$group":{"_id":"$job" ,"p_count":{"$sum":1},"job_total_salary":{"$sum":"$salary"},"avg_salary":{"$avg":"$salary"}}}])
複製程式碼

// 1 { "_id": "MANAGER", "p_count": 4, "job_total_salary": 22000, "avg_salary": 5500 }

// 2 { "_id": "PRESIDENT", "p_count": 3, "job_total_salary": 21000, "avg_salary": 7000 }

// 3 { "_id": "CLERK", "p_count": 7, "job_total_salary": 18000, "avg_salary": 2571.42857142857 }

求出每個職位最高,最低工資
db.emps.aggregate([{"$group":{"_id":"$job","max":{"$max":"$salary"} , "min":{"$min":"$salary"}}}])
複製程式碼

// 1 { "_id": "MANAGER", "max": 6000, "min": 5000 }

// 2 { "_id": "PRESIDENT", "max": 7000, "min": 7000 }

// 3 { "_id": "CLERK", "max": 4000, "min": 1000 }

求出每個職位的工資
db.emps.aggregate([{"$group":{"_id":"$job","salary":{"$push":"$salary"}}}])
複製程式碼

// 1 { "_id": "MANAGER", "salary": [ 5000, 6000, 5000, 6000 ] }

// 2 { "_id": "PRESIDENT", "salary": [ 7000, 7000 ] }

// 3 { "_id": "CLERK", "salary": [ 1000, 2000, 4000, 1000, 2000, 4000 ] }

$push

可以將資料變為陣列儲存,但是有一個問題重複資料也會進行儲存

db.emps.aggregate([{"$group":{"_id":"$job","salary":{"$push":"$salary"}}}])
複製程式碼

再插入兩條資料

db.emps.insert({"name":"孫七","age":31,"sex":"男","job":"CLERK","salary":4000}) db.emps.insert({"name":"王八","age":35,"sex":"女","job":"PRESIDENT","salary":7000})

查詢

2.png

查詢結果

// 1 { "_id": "MANAGER", "salary": [ 5000, 6000, 5000, 6000 ] }

// 2 { "_id": "PRESIDENT", "salary": [ 7000, 7000, 7000 ] }

// 3 { "_id": "CLERK", "salary": [ 1000, 2000, 4000, 1000, 2000, 4000, 4000 ] }

解決辦法是使用 $addToSet

$addToSet

mongo 中提供取消重複的資料 , $addToSet 預設顯示全部資料

db.emps.aggregate([{"$group":{"_id":"$job","salary":{"$addToSet":"$salary"}}}])</pre>
複製程式碼

// 1 { "_id": "MANAGER", "salary": [ 6000, 5000 ] }

// 2 { "_id": "PRESIDENT", "salary": [ 7000 ] }

// 3 { "_id": "CLERK", "salary": [ 4000, 2000, 1000 ] }

反著來,第一個是最後一個。 取的第一個:

db.emps.aggregate([{"$group":{"_id":"$job","salary":{"$first":"$salary"}}}])</pre>
複製程式碼

// 1 { "_id": "MANAGER", "salary": 5000 }

// 2 { "_id": "PRESIDENT", "salary": 7000 }

// 3 { "_id": "CLERK", "salary": 1000 }

取最後一個

db.emps.aggregate([{"$group":{"_id":"$job","salary":{"$last":"$salary"}}}])
複製程式碼

// 1 { "_id": "MANAGER", "salary": 6000 }

// 2 { "_id": "PRESIDENT", "salary": 7000 }

// 3 { "_id": "CLERK", "salary": 4000 }

所有的資料都是無序的,並且不可能支援大資料量。

$project

可以利用 來控制資料列的顯示規則

普通列:{成員:1或者 true } : 表示要實現的 *id 列 {"*id":0 或者false} 表示_id 列是否顯示

條件過濾 {成員:表示式} 滿足表示式之後的資料可以進行顯示:

只顯示 name , job 列 不顯示 id 列

db.emps.aggregate({"$project":{"name":1,"_id":0}})
複製程式碼

// 1 { "name": "張三" }

// 2 { "name": "李四" }

// 3 { "name": "王五" }

// 4 { "name": "趙六" }

// 5 { "name": "孫七" }

// 6 { "name": "王八" }

// 7 { "name": "張三" }

// 8 { "name": "李四" }

// 9 { "name": "王五" }

// 10 { "name": "趙六" }

// 11 { "name": "孫七" }

// 12 { "name": "王八" }

// 13 { "name": "孫七" }

// 14 { "name": "王八" }

只有設定進去的列才能被顯示出來,其他列不顯示出來。

四則運算:
$add 加法
$subtract 減法
$divide 除法
$multiply 乘法
年薪計算:
 db.emps.aggregate([{"$project":{"name":1,  "_id":0,  "salary":1,  "salary":{"年薪":{"$multiply":["$salary",12]}}  }}])
複製程式碼

// 1 { "name": "張三", "salary": { "年薪": 12000 } }

// 2 { "name": "李四", "salary": { "年薪": 24000 } }

// 3 { "name": "王五", "salary": { "年薪": 60000 } }

// 4 { "name": "趙六", "salary": { "年薪": 72000 } }

// 5 { "name": "孫七", "salary": { "年薪": 48000 } }

// 6 { "name": "王八", "salary": { "年薪": 84000 } }

// 7 { "name": "張三", "salary": { "年薪": 12000 } }

// 8 { "name": "李四", "salary": { "年薪": 24000 } }

// 9 { "name": "王五", "salary": { "年薪": 60000 } }

// 10 { "name": "趙六", "salary": { "年薪": 72000 } }

// 11 { "name": "孫七", "salary": { "年薪": 48000 } }

// 12 { "name": "王八", "salary": { "年薪": 84000 } }

// 13 { "name": "孫七", "salary": { "年薪": 48000 } }

// 14 { "name": "王八", "salary": { "年薪": 84000 } }

關係運算:

大小比較 $cmp
大於 $gt
小於 $lt
大於等於 $gte
小於等於 $lte
不等於 $ne
判斷null $ifNull
等於 $eq

結果返回布林值

月薪大於3000的資料員工

"$project":{
"_id":false,
"name":1,
"job":1,
"工資":"$salary",
"salary":{"$gt":["$salary" , 3000]}}
}
]);
複製程式碼

// 1 { "name": "張三", "job": "CLERK", "工資": 1000, "salary": false }

// 2 { "name": "李四", "job": "CLERK", "工資": 2000, "salary": false }

// 3 { "name": "王五", "job": "MANAGER", "工資": 5000, "salary": true }

// 4 { "name": "趙六", "job": "MANAGER", "工資": 6000, "salary": true }

// 5 { "name": "孫七", "job": "CLERK", "工資": 4000, "salary": true }

// 6 { "name": "王八", "job": "PRESIDENT", "工資": 7000, "salary": true }

// 7 { "name": "張三", "job": "CLERK", "工資": 1000, "salary": false }

// 8 { "name": "李四", "job": "CLERK", "工資": 2000, "salary": false }

// 9 { "name": "王五", "job": "MANAGER", "工資": 5000, "salary": true }

// 10 { "name": "趙六", "job": "MANAGER", "工資": 6000, "salary": true }

// 11 { "name": "孫七", "job": "CLERK", "工資": 4000, "salary": true }

// 12 { "name": "王八", "job": "PRESIDENT", "工資": 7000, "salary": true }

// 13 { "name": "孫七", "job": "CLERK", "工資": 4000, "salary": true }

// 14 { "name": "王八", "job": "PRESIDENT", "工資": 7000, "salary": true }

邏輯運算

$and
$or
$not

字串處理

連線 $concat
擷取 $substr
轉小寫 $toLower
大小寫比較 $strcsecmp
相等 $eq

查詢職位是MANAGER的資訊 區分小寫

 db.emps.aggregate([{  "$project":{  "_id":false,  "name":1,  "job":1,  "是否":{"$eq":["$job","MANAGER"]},   "工資":"$salary",  "salary":{"$gt":["$salary" , 3000]}}  }  ]);
複製程式碼

// 1 { "name": "張三", "job": "CLERK", "是否": false, "工資": 1000, "salary": false }

// 2 { "name": "李四", "job": "CLERK", "是否": false, "工資": 2000, "salary": false }

// 3 { "name": "王五", "job": "MANAGER", "是否": true, "工資": 5000, "salary": true }

// 4 { "name": "趙六", "job": "MANAGER", "是否": true, "工資": 6000, "salary": true }

// 5 { "name": "孫七", "job": "CLERK", "是否": false, "工資": 4000, "salary": true }

// 6 { "name": "王八", "job": "PRESIDENT", "是否": false, "工資": 7000, "salary": true }

// 7 { "name": "張三", "job": "CLERK", "是否": false, "工資": 1000, "salary": false }

// 8 { "name": "李四", "job": "CLERK", "是否": false, "工資": 2000, "salary": false }

// 9 { "name": "王五", "job": "MANAGER", "是否": true, "工資": 5000, "salary": true }

// 10 { "name": "趙六", "job": "MANAGER", "是否": true, "工資": 6000, "salary": true }

// 11 { "name": "孫七", "job": "CLERK", "是否": false, "工資": 4000, "salary": true }

// 12 { "name": "王八", "job": "PRESIDENT", "是否": false, "工資": 7000, "salary": true }

// 13 { "name": "孫七", "job": "CLERK", "是否": false, "工資": 4000, "salary": true }

// 14 { "name": "王八", "job": "PRESIDENT", "是否": false, "工資": 7000, "salary": true }

轉大寫

先轉為大寫,在比較相等

db.emps.aggregate([{  "$project":{  "_id":false,  "name":1,  "job":1,  "是否":{"$eq":["$job",{"$toUpper":"manager"}]},  "工資":"$salary"  }}  ]);
複製程式碼

// 1 { "name": "張三", "job": "CLERK", "是否": false, "工資": 1000 }

// 2 { "name": "李四", "job": "CLERK", "是否": false, "工資": 2000 }

// 3 { "name": "王五", "job": "MANAGER", "是否": true, "工資": 5000 }

// 4 { "name": "趙六", "job": "MANAGER", "是否": true, "工資": 6000 }

// 5 { "name": "孫七", "job": "CLERK", "是否": false, "工資": 4000 }

// 6 { "name": "王八", "job": "PRESIDENT", "是否": false, "工資": 7000 }

// 7 { "name": "張三", "job": "CLERK", "是否": false, "工資": 1000 }

// 8 { "name": "李四", "job": "CLERK", "是否": false, "工資": 2000 }

// 9 { "name": "王五", "job": "MANAGER", "是否": true, "工資": 5000 }

// 10 { "name": "趙六", "job": "MANAGER", "是否": true, "工資": 6000 }

// 11 { "name": "孫七", "job": "CLERK", "是否": false, "工資": 4000 }

// 12 { "name": "王八", "job": "PRESIDENT", "是否": false, "工資": 7000 }

// 13 { "name": "孫七", "job": "CLERK", "是否": false, "工資": 4000 }

// 14 { "name": "王八", "job": "PRESIDENT", "是否": false, "工資": 7000 }

比較字串

區分小寫 用字串比較大小 0表示返回正確

 db.emps.aggregate([{  "$project":{  "_id":false,  "name":1,  "job":1,  "是否":{"$strcasecmp":["$job","manager"]}, "工資":"$salary"  }}  ]);
複製程式碼

// 1 { "name": "張三", "job": "CLERK", "是否": NumberInt("-1"), "工資": 1000 }

// 2 { "name": "李四", "job": "CLERK", "是否": NumberInt("-1"), "工資": 2000 }

// 3 { "name": "王五", "job": "MANAGER", "是否": NumberInt("0"), "工資": 5000 }

// 4 { "name": "趙六", "job": "MANAGER", "是否": NumberInt("0"), "工資": 6000 }

// 5 { "name": "孫七", "job": "CLERK", "是否": NumberInt("-1"), "工資": 4000 }

// 6 { "name": "王八", "job": "PRESIDENT", "是否": NumberInt("1"), "工資": 7000 }

// 7 { "name": "張三", "job": "CLERK", "是否": NumberInt("-1"), "工資": 1000 }

// 8 { "name": "李四", "job": "CLERK", "是否": NumberInt("-1"), "工資": 2000 }

// 9 { "name": "王五", "job": "MANAGER", "是否": NumberInt("0"), "工資": 5000 }

// 10 { "name": "趙六", "job": "MANAGER", "是否": NumberInt("0"), "工資": 6000 }

// 11 { "name": "孫七", "job": "CLERK", "是否": NumberInt("-1"), "工資": 4000 }

// 12 { "name": "王八", "job": "PRESIDENT", "是否": NumberInt("1"), "工資": 7000 }

// 13 { "name": "孫七", "job": "CLERK", "是否": NumberInt("-1"), "工資": 4000 }

// 14 { "name": "王八", "job": "PRESIDENT", "是否": NumberInt("1"), "工資": 7000 }

擷取字串

 db.emps.aggregate([{  "$project":{  "_id":false,  "name":1,  "job":"$job",  "job1":{"前三位":{"$substr":["$job",0,3]}},  "job2":{"$substr":["$job",0,3]}  }  }]);
複製程式碼

// 1 { "name": "張三", "job": "CLERK", "job1": { "前三位": "CLE" }, "job2": "CLE" }

// 2 { "name": "李四", "job": "CLERK", "job1": { "前三位": "CLE" }, "job2": "CLE" }

// 3 { "name": "王五", "job": "MANAGER", "job1": { "前三位": "MAN" }, "job2": "MAN" }

// 4 { "name": "趙六", "job": "MANAGER", "job1": { "前三位": "MAN" }, "job2": "MAN" }

// 5 { "name": "孫七", "job": "CLERK", "job1": { "前三位": "CLE" }, "job2": "CLE" }

// 6 { "name": "王八", "job": "PRESIDENT", "job1": { "前三位": "PRE" }, "job2": "PRE" }

// 7 { "name": "張三", "job": "CLERK", "job1": { "前三位": "CLE" }, "job2": "CLE" }

// 8 { "name": "李四", "job": "CLERK", "job1": { "前三位": "CLE" }, "job2": "CLE" }

// 9 { "name": "王五", "job": "MANAGER", "job1": { "前三位": "MAN" }, "job2": "MAN" }

// 10 { "name": "趙六", "job": "MANAGER", "job1": { "前三位": "MAN" }, "job2": "MAN" }

// 11 { "name": "孫七", "job": "CLERK", "job1": { "前三位": "CLE" }, "job2": "CLE" }

// 12 { "name": "王八", "job": "PRESIDENT", "job1": { "前三位": "PRE" }, "job2": "PRE" }

// 13 { "name": "孫七", "job": "CLERK", "job1": { "前三位": "CLE" }, "job2": "CLE" }

// 14 { "name": "王八", "job": "PRESIDENT", "job1": { "前三位": "PRE" }, "job2": "PRE" }

相關文章