Để tìm các document mà mảng không chứa bất kỳ phần tử nào có giá trị trường cụ thể, bạn sử dụng toán tử $nin (not in).
Cú pháp
db.collection.find({ 'arrayField.fieldName': { $nin: [value1, value2, ...] } })
Ví dụ minh họa
Tạo collection và dữ liệu
> db.documentWithAParticularFieldValueDemo.insertOne({
"StudentId": 101,
"StudentDetails": [
{ "TheoryMarks": 78, "PracticalMarks": 91 },
{ "TheoryMarks": 75, "PracticalMarks": 75 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8edab72f684a30fbdfd586") }
> db.documentWithAParticularFieldValueDemo.insertOne({
"StudentId": 102,
"StudentDetails": [
{ "TheoryMarks": 91, "PracticalMarks": 91 },
{ "TheoryMarks": 75, "PracticalMarks": 75 }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8edaf12f684a30fbdfd587") }
Xem dữ liệu
> db.documentWithAParticularFieldValueDemo.find().pretty();
{
"_id" : ObjectId("5c8edab72f684a30fbdfd586"),
"StudentId" : 101,
"StudentDetails" : [
{ "TheoryMarks" : 78, "PracticalMarks" : 91 },
{ "TheoryMarks" : 75, "PracticalMarks" : 75 }
]
}
{
"_id" : ObjectId("5c8edaf12f684a30fbdfd587"),
"StudentId" : 102,
"StudentDetails" : [
{ "TheoryMarks" : 91, "PracticalMarks" : 91 },
{ "TheoryMarks" : 75, "PracticalMarks" : 75 }
]
}
Tìm student KHÔNG có môn nào TheoryMarks = 78
> db.documentWithAParticularFieldValueDemo.find({'StudentDetails.TheoryMarks': {$nin: [78]}}).pretty();
{
"_id" : ObjectId("5c8edaf12f684a30fbdfd587"),
"StudentId" : 102,
"StudentDetails" : [
{ "TheoryMarks" : 91, "PracticalMarks" : 91 },
{ "TheoryMarks" : 75, "PracticalMarks" : 75 }
]
}
Chỉ StudentId 102 được trả về vì mảng StudentDetails của nó không có phần tử nào có TheoryMarks = 78.
Giải thích cơ chế
StudentDetails.TheoryMarkstruy xuất tất cả giá trị TheoryMarks trong mảng$nin: [78]nghĩa là "không có giá trị nào trong mảng bằng 78"- Student 101 có [78, 75] → có 78 → loại trừ
- Student 102 có [91, 75] → không có 78 → giữ lại
So sánh $nin vs $ne vs $not
| Toán tử | Ý nghĩa | Ví dụ |
|---|---|---|
$nin | Không có giá trị nào trong mảng thuộc tập hợp | {tags: {$nin: ["a", "b"]}} |
$ne | Giá trị không bằng (cho scalar) | {age: {$ne: 20}} |
$not | Phủ định điều kiện regex/expression | {name: {$not: /^John/}} |
Lưu ý
$nintrên mảng: document match nếu không có phần tử nào khớp- Document không có trường hoặc mảng rỗng: match (vacuous truth)
- Hiệu năng: $nin không dùng index hiệu quả, cân nhắc trên collection lớn