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()
複製程式碼
$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})
查詢
查詢結果
// 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" }