Để 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:
$elemMatchvớ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.