Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Khớp mảng chứa bất kỳ tổ hợp nào của mảng cho trước trong MongoDB

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:

  1. $nin: ['C++', 'Java'] - phần tử KHÔNG phải C++ VÀ KHÔNG phải Java
  2. $elemMatch - tồn tại phần tử thỏa mãn điều kiện trên
  3. $not - PHỦ NHẬN: KHÔNG tồn tại phần tử nào ngoài C++ và Java
  4. => 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']}}