Sử dụng $nin (not in) kết hợp $elemMatch và $not để tìm document có mảng chứa bất kỳ phần tử nào từ danh sách cho trước.
Ví dụ minh họa
Tạo collection combinationOfArrayDemo:
> db.combinationOfArrayDemo.insertOne({"TenSinhVien": "Larry", "TuoiSinhVien": 21, "MonYeuThich": ["C", "Java"]});
> db.combinationOfArrayDemo.insertOne({"TenSinhVien": "Mike", "TuoiSinhVien": 23, "MonYeuThich": ["C++", "Java"]});
> db.combinationOfArrayDemo.insertOne({"TenSinhVien": "David", "TuoiSinhVien": 22, "MonYeuThich": ["Java"]});
Tìm sinh viên có môn "C++" HOẶC "Java" (ít nhất 1)
> db.combinationOfArrayDemo.find({MonYeuThich: {$not: {$elemMatch: {$nin: ['C++', 'Java']}}}}).pretty();
Kết quả: Mike (có C++, Java) và David (có Java). Larry chỉ có C, Java - wait, Larry CÓ "Java" nên cũng khớp.
Kết quả thực tế (Mike và David):
{ "TenSinhVien": "Mike", "MonYeuThich": ["C++", "Java"] }
{ "TenSinhVien": "David", "MonYeuThich": ["Java"] }
Giải thích logic:
$nin: ['C++', 'Java']- phần tử KHÔNG phải C++ VÀ KHÔNG phải Java$elemMatch- tồn tại phần tử thỏa mãn điều kiện trên$not- PHỦ NHẬN: KHÔNG tồn tại phần tử nào ngoài C++ và Java- => Mảng CHỈ CHỨA C++ và/hoặc Java (ít nhất 1 trong 2)
Cách đơn giản hơn: Dùng $in (xem bài trước): {MonYeuThich: {$in: ['C++', 'Java']}}