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

Kiểm tra tất cả phần tử của trường có nằm trong tập cha (superset) trong MongoDB

Để kiểm tra xem tất cả phần tử của một trường mảng có nằm trong một tập cho trước (superset) hay không, sử dụng find() kết hợp $not, $elemMatch và $nin.

Tạo collection dữ liệu

> db.demo624.insertOne({"ListOfName":["John","Chris","David","Bob"]});
> db.demo624.insertOne({"ListOfName":["John","Chris"]});
> db.demo624.insertOne({"ListOfName":["John","Chris","Carol"]});
> db.demo624.insertOne({"ListOfName":["John","Chris","Bob"]});
> db.demo624.insertOne({"ListOfName":["John","Chris","Mike","Robert"]});

Hiển thị tất cả document

> db.demo624.find();

Kết quả:

{
  "_id" : ObjectId("5e9ab3ff6c954c74be91e6a5"),
  "ListOfName" : [ "John", "Chris", "David", "Bob" ]
}
{
  "_id" : ObjectId("5e9ab4026c954c74be91e6a6"),
  "ListOfName" : [ "John", "Chris" ]
}
{
  "_id" : ObjectId("5e9ab4076c954c74be91e6a7"),
  "ListOfName" : [ "John", "Chris", "Carol" ]
}
{
  "_id" : ObjectId("5e9ab40e6c954c74be91e6a8"),
  "ListOfName" : [ "John", "Chris", "Bob" ]
}
{
  "_id" : ObjectId("5e9ab4186c954c74be91e6a9"),
  "ListOfName" : [ "John", "Chris", "Mike", "Robert" ]
}

Truy vấn kiểm tra tập con

Tìm các document mà tất cả phần tử trong ListOfName đều nằm trong tập ["John", "Chris", "David", "Bob"]:

> db.demo624.find({
  "ListOfName": {
    $not: {
      $elemMatch: {
        $nin: ["John", "Chris", "David", "Bob"]
      }
    }
  }
});

Kết quả (3 document thỏa mãn):

{
  "_id" : ObjectId("5e9ab3ff6c954c74be91e6a5"),
  "ListOfName" : [ "John", "Chris", "David", "Bob" ]
}
{
  "_id" : ObjectId("5e9ab4026c954c74be91e6a6"),
  "ListOfName" : [ "John", "Chris" ]
}
{
  "_id" : ObjectId("5e9ab40e6c954c74be91e6a8"),
  "ListOfName" : [ "John", "Chris", "Bob" ]
}

Giải thích logic:

  • $elemMatch với $nin: tìm phần tử không nằm trong tập cho trước
  • $not: phủ định kết quả trên → không có phần tử nào nằm ngoài tập → tất cả phần tử đều trong tập

Document chứa "Carol", "Mike", "Robert" bị loại vì có phần tử không thuộc tập superset.