Để lọc document trong pipeline aggregate, sử dụng $match. Toán tử này truyền tiếp các document khớp điều kiện sang stage tiếp theo.
Tạo collection với mảng lồng nhau
> db.demo629.insertOne({
"Subject": ["MySQL", "MongoDB"],
"details": [
{ Name: "Chris", "Marks": 78 },
{ Name: "David", "Marks": 89 }
]
});
Hiển thị document gốc
> db.demo629.find();
Kết quả:
{
"_id" : ObjectId("5e9ae9f56c954c74be91e6b9"),
"Subject" : [ "MySQL", "MongoDB" ],
"details" : [
{ "Name" : "Chris", "Marks" : 78 },
{ "Name" : "David", "Marks" : 89 }
]
}
Pipeline lọc: unwind + match + project
> db.demo629.aggregate([
{ "$unwind": "$details" },
{
"$match": {
"details.Name": "Chris",
"Subject": { "$in": ["Java", "MySQL", "Python", "C", "C++"] }
}
},
{ "$project": { "details": 1, "_id": 0 } }
]);
Kết quả:
{
"details" : { "Name" : "Chris", "Marks" : 78 }
}
Giải thích từng stage:
$unwind: "$details": Phân rã mảngdetails→ 2 document riêng biệt$match: Lọc document códetails.Name = "Chris"VÀSubjectchứa một trong các giá trị liệt kê ($in)$project: Chỉ giữ trườngdetails, ẩn_id
Document với David bị loại do không khớp Name. Subject có "MySQL" khớp điều kiện $in.