Sử dụng toán tử $elemMatch để tìm kiếm trong mảng đối tượng với nhiều điều kiện trên cùng một phần tử.
Ví dụ minh họa
Tạo collection searchArrayDemo với mảng đối tượng ChiTietNhanVien:
> db.searchArrayDemo.insertOne({
"HoNhanVien": "Adam", "TenNhanVien": "Smith",
"NgaySinh": ISODate("1992-01-31T13:45:10Z"),
"KyNang": ["Spring and Hibernate Framework", "Machine Learning"],
"ChiTietNhanVien": [
{"LinhVucHieuSuat": "Java", "Nam": 2001},
{"LinhVucHieuSuat": "Python", "Nam": 2005}
]
});
> db.searchArrayDemo.insertOne({
"HoNhanVien": "Carol", "TenNhanVien": "Taylor",
"NgaySinh": ISODate("1993-04-21T11:10:20Z"),
"KyNang": ["C++", "Cloud Computing"],
"ChiTietNhanVien": [
{"LinhVucHieuSuat": "C++", "Nam": 1998},
{"LinhVucHieuSuat": "C++ Game Developer", "Nam": 2007}
]
});
Trường hợp 1: Tìm thấy (C++ năm 1998)
> db.searchArrayDemo.find({ChiTietNhanVien: {$elemMatch: {LinhVucHieuSuat: "C++", Nam: 1998}}}).pretty();
Trả về document của Carol.
Trường hợp 2: Không tìm thấy (C năm 1996)
> db.searchArrayDemo.find({ChiTietNhanVien: {$elemMatch: {LinhVucHieuSuat: "C", Nam: 1996}}}).pretty();
Không trả về document nào.
Điểm quan trọng: $elemMatch yêu cầu cùng một phần tử mảng thỏa mãn TẤT CẢ điều kiện. Không dùng $elemMatch sẽ match nếu các điều kiện thỏa mãn bởi các phần tử khác nhau.