Để lọc tài liệu trong Aggregation Pipeline dựa trên việc một trường (có thể trong mảng object) chứa chuỗi cụ thể, bạn dùng stage $match với cú pháp truy vấn chuẩn (Regex hoặc exact match). $match trong aggregation hoạt động y hệt find() nhưng cho phép kết hợp với các stage khác.
1. Tạo dữ liệu: 2 tài liệu, mỗi tài liệu có mảng Information (object id, Name)
> db.demo424.insert({ "Information": [{ id: 10, Name: "Chris" }, { id: 11, Name: "David" }] });
> db.demo424.insert({ "Information": [{ id: 101, Name: "Mike" }, { id: 102, Name: "John" }] });
2. Xem dữ liệu
> db.demo424.find();
Kết quả: 2 tài liệu, mảng Information khác nhau.
3. Aggregation: $match tài liệu có Information.Name = "Chris"
> db.demo424.aggregate([
{ $match: { "Information.Name": "Chris" } }
]);
4. Kết quả: Trả về TOÀN BỘ tài liệu cha (không chỉ phần tử khớp)
{ "_id": ObjectId("..."), "Information": [
{ "id": 10, "Name": "Chris" },
{ "id": 11, "Name": "David" }
] }
Giải thích:
$matchlọc ở cấp **tài liệu (document)**. Nếu mảng Information chứa "Chris", cả tài liệu được giữ lại.- Để chỉ lấy phần tử "Chris" trong mảng -> Dùng
$unwind+$match(xem bài 1003070919). - Có thể dùng Regex:
{ $match: { "Information.Name": /Chris/ } }.
Tối ưu: Đặt $match **đầu pipeline** (sau $unwind nếu cần) để dùng index và giảm dữ liệu xử lý cho các stage sau.