Toán tử $elemMatch cho phép lọc document dựa trên việc mảng chứa phần tử thỏa mãn nhiều điều kiện cùng lúc.
Dữ liệu mẫu
> db.demo87.insertOne({
id:101,
"Details": [
{ "EmployeeName": "Chris", "Salary": 45000 },
{ "EmployeeName": "David", "Salary": 50000 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2c113871bf0181ecc422ab") }
> db.demo87.insertOne({
id:102,
"Details": [
{ "EmployeeName": "Chris", "Salary": 65000 },
{ "EmployeeName": "Mike", "Salary": 100000 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2c114371bf0181ecc422ac") }
Truy vấn $elemMatch
Tìm document có phần tử EmployeeName="Chris" VÀ Salary=65000:
> db.demo87.find({ Details: { $elemMatch: { "EmployeeName": 'Chris', "Salary": 65000 }}});
Kết quả
{ "_id" : ObjectId("5e2c114371bf0181ecc422ac"), "id" : 102, "Details" : [ { "EmployeeName" : "Chris", "Salary" : 65000 }, { "EmployeeName" : "Mike", "Salary" : 100000 } ] }
Tại sao cần $elemMatch?
Nếu dùng truy vấn thường: { "Details.EmployeeName": "Chris", "Details.Salary": 65000 }
- Document 1: Chris(45000) + David(50000) → Khớp Name=Chris (phần tử 1) VÀ Salary=65000 (không có) → Không khớp
- Document 2: Chris(65000) + Mike(100000) → Khớp cả hai → Khớp
Kết quả đúng, nhưng logic ngầm hiểu: có một phần tử thỏa Name=Chris VÀ có một phần tử (có thể khác) thỏa Salary=65000. $elemMatch đảm bảo cùng một phần tử thỏa cả hai.