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
階段對文件進行分組,以瞭解在特定月份和年份中任命了多少員工。