MongoDB 中$Match(聚合)階段的使用
-
在 MongoDB 中使用
$match(聚合)階段 -
在 MongoDB 中將
$match與比較運算子一起使用 -
在 MongoDB 中使用
$match和$project階段 -
在 MongoDB 中使用
$match和$and運算子 -
在 MongoDB 中使用
$match和$or運算子 -
在 MongoDB 中使用
$match聚合與$group -
在 MongoDB 中使用
$match聚合與$month和$year
本教程簡要討論了 $match 聚合階段,並演示了考慮不同場景的 $match 階段。
在 MongoDB 中使用 $match(聚合)階段
$match 階段讓我們過濾與指定條件(或條件集)匹配的文件(記錄)。只有匹配的文件才會進入管道的下一階段。
讓我們準備一個包含一些文件的集合,以通過程式碼示例進行學習。
示例程式碼:
db.createCollection('employee');
db.employee.insertMany([
{
"emp_code": "ma001",
"emp_age": 30,
"emp_grade": 18,
"emp_joindate": ISODate('2012-08-16T00:00:00Z')
},
{
"emp_code": "tc002",
"emp_age": 40,
"emp_grade":19,
"emp_joindate": ISODate('2011-08-16T00:00:00Z')
},
{
"emp_code": "km003",
"emp_age": 45,
"emp_grade":18,
"emp_joindate": ISODate('2012-08-26T00:00:00Z')
},
{
"emp_code": "ar004",
"emp_age": 32,
"emp_grade":20,
"emp_joindate": ISODate('2014-10-06T00:00:00Z')
},
{
"emp_code": "za005",
"emp_age": 45,
"emp_grade":20,
"emp_joindate": ISODate('2014-03-11T00:00:00Z')
},
{
"emp_code": "ka006",
"emp_age": 35,
"emp_grade": 22,
"emp_joindate": ISODate('2018-06-16T00:00:00Z')
}
]);
db.employee.find().pretty();
輸出:
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a0"),
"emp_code" : "ma001",
"emp_age" : 30,
"emp_grade" : 18,
"emp_joindate" : ISODate("2012-08-16T00:00:00Z")
}
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a1"),
"emp_code" : "tc002",
"emp_age" : 40,
"emp_grade" : 19,
"emp_joindate" : ISODate("2011-08-16T00:00:00Z")
}
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a2"),
"emp_code" : "km003",
"emp_age" : 45,
"emp_grade" : 18,
"emp_joindate" : ISODate("2012-08-26T00:00:00Z")
}
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a3"),
"emp_code" : "ar004",
"emp_age" : 32,
"emp_grade" : 20,
"emp_joindate" : ISODate("2014-10-06T00:00:00Z")
}
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a4"),
"emp_code" : "za005",
"emp_age" : 45,
"emp_grade" : 20,
"emp_joindate" : ISODate("2014-03-11T00:00:00Z")
}
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a5"),
"emp_code" : "ka006",
"emp_age" : 35,
"emp_grade" : 22,
"emp_joindate" : ISODate("2018-06-16T00:00:00Z")
}
一旦我們完成建立集合併在其中插入文件,我們就可以繼續使用 $match 聚合階段來學習。考慮到各種情況,讓我們使用 $match 階段來更好地學習。
在 MongoDB 中將 $match 與比較運算子一起使用
示例程式碼:
db.employee.aggregate([
{
$match:{ "emp_age": { $gt:35 }}
}
]).pretty();
輸出:
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a1"),
"emp_code" : "tc002",
"emp_age" : 40,
"emp_grade" : 19,
"emp_joindate" : ISODate("2011-08-16T00:00:00Z")
}
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a2"),
"emp_code" : "km003",
"emp_age" : 45,
"emp_grade" : 18,
"emp_joindate" : ISODate("2012-08-26T00:00:00Z")
}
{
"_id" : ObjectId("629c376ca4cfbd782e90d5a4"),
"emp_code" : "za005",
"emp_age" : 45,
"emp_grade" : 20,
"emp_joindate" : ISODate("2014-03-11T00:00:00Z")
}
在這裡,我們只得到那些 emp_age(員工年齡)大於 35 的文件。pretty() 函式什麼都不做,只是以有組織的方式顯示輸出。
在 MongoDB 中使用 $match 和 $project 階段
示例程式碼:
db.employee.aggregate([
{
$match: {
"emp_age": { $gt:35 }
}
},
{
$project:{
"_id": 0,
"emp_code": 1,
"emp_age": 1
}
}
]);
輸出:
{ "emp_code" : "tc002", "emp_age" : 40 }
{ "emp_code" : "km003", "emp_age" : 45 }
{ "emp_code" : "za005", "emp_age" : 45 }
此程式碼片段類似於前面的示例,但額外使用了 $project 階段,該階段指定應從查詢中返回哪些欄位。在 $project 階段使用 1 和 0 分別表示該欄位的包含和抑制。
請記住,第一階段返回的檔案只會在下一階段處理。我們從所有那些 emp_age(員工年齡)大於 35 的文件中獲取 emp_code 和 emp_age。
在 MongoDB 中使用 $match 和 $and 運算子
示例程式碼:
db.employee.aggregate([
{
$match:{
$and: [
{ "emp_age": {$gte:32 }},
{ "emp_grade": {$gt: 20}}
]
}
},
{
$project:{
"_id": 0,
"emp_age": 1,
"emp_grade": 1
}
}
]);
輸出:
{ "emp_age" : 35, "emp_grade" : 22 }
此示例從那些 emp_age 大於或等於 32 且 emp_grade 大於 20 的文件返回 emp_age 和 emp_grade。請記住,生成的文件必須同時滿足這兩個條件。
在 MongoDB 中使用 $match 和 $or 運算子
示例程式碼:
db.employee.aggregate([
{
$match:{
$or: [
{ "emp_age": {$gte:32 }},
{ "emp_grade": {$gt: 20}}
]
}
},
{
$project:{
"_id": 0,
"emp_age": 1,
"emp_grade": 1
}
}
]);
輸出:
{ "emp_age" : 40, "emp_grade" : 19 }
{ "emp_age" : 45, "emp_grade" : 18 }
{ "emp_age" : 32, "emp_grade" : 20 }
{ "emp_age" : 45, "emp_grade" : 20 }
{ "emp_age" : 35, "emp_grade" : 22 }
此程式碼片段與上一個類似,但我們在這裡使用 $or 運算子。在這裡,生成的文件必須滿足至少一個條件或同時滿足這兩個條件。
在 MongoDB 中使用 $match 聚合與 $group
示例程式碼:
db.employee.aggregate([
{
$match:{
$or: [
{ "emp_age": {$gte:32 }},
{ "emp_grade": {$gt: 20}}
]
}
},
{
$group:{
_id: '$emp_grade',
Employees: { $sum: 1 } }
}
]);
輸出:
{ _id: 18, Employees: 1 }
{ _id: 20, Employees: 2 }
{ _id: 19, Employees: 1 }
{ _id: 22, Employees: 1 }
首先,我們得到那些 emp_age 大於或等於 32、emp_grade 大於 20 或兩者兼有的文件。滿足條件的文件也將包含在結果集中。
這些生成的文件將移至下一階段,即我們用來對文件進行分組的 $group。員工的等級。在 $group 階段,我們將 emp_grade 的值儲存在 _id 中,並將該特定等級的計數儲存在 Employees 變數中。
在 MongoDB 中使用 $match 聚合與 $month 和 $year
示例程式碼:
db.employee.aggregate([
{
$match: {
"emp_joindate" : {
$gte:ISODate('2012-01-01'),
$lt: ISODate('2014-12-30')
}
}
},
{
$project:{
"_id": 0,
"emp_code": 1,
"emp_age": 1,
"emp_grade": 1,
"new_created": {
"year" : {"$year" : "$emp_joindate"},
"month" : {"$month" : "$emp_joindate"}
}
}
},
{
$group:{
_id: "$new_created",
EmployeesCount:{ $sum:1 }
}
}
]);
輸出:
{ _id: { year: 2012, month: 8 }, EmployeesCount: 2 }
{ _id: { year: 2014, month: 10 }, EmployeesCount: 1 }
{ _id: { year: 2014, month: 3 }, EmployeesCount: 1 }
這個最終的程式碼片段包含本教程前面解釋的所有概念。在這裡,我們使用下面解釋的三個階段。
首先,我們使用 $match 聚合階段來獲取 emp_joindate 大於或等於 2012-01-01 且小於 2014-12-30 的所有文件。就 ISODate() 函式而言,它是一個幫助函式,用於包裝原生 JavaScript DATE 物件。
每當我們在 Mongo shell 上使用 ISODate() 建構函式時,它都會返回 JavaScript 的 DATE 物件。 $match 階段的結果文件被髮送到 $project 階段。
在 $project 聚合階段,我們指定應該返回文件的哪些欄位。此外,我們分別使用 $year 和 $month 從 emp_joindate 中提取年份和月份。
然後,我們將提取的月份和年份儲存在 new_created 變數中。這個階段的結果被傳遞到 $group 聚合階段。
我們在 $group 階段對文件進行分組,以瞭解在特定月份和年份中任命了多少員工。
