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

Tìm document mảng không chứa giá trị trường cụ thể trong MongoDB

Để 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.TheoryMarks truy 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ĩaVí dụ
$ninKhông có giá trị nào trong mảng thuộc tập hợp{tags: {$nin: ["a", "b"]}}
$neGiá trị không bằng (cho scalar){age: {$ne: 20}}
$notPhủ định điều kiện regex/expression{name: {$not: /^John/}}

Lưu ý

  • $nin trê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