MongoDB 中的 NOT IN 比較運算子

Mehvish Ashiq 2023年1月30日
  1. MongoDB 中的 $nin (NOT IN) 比較運算子
  2. 在 MongoDB 中使用 $nin 運算子和 find() 方法查詢欄位
  3. 在 MongoDB 中使用 $nin 運算子和 find() 方法查詢嵌入式文件
  4. 在 MongoDB 中使用 $nin 運算子和 find() 方法中查詢陣列
  5. 在 MongoDB 中使用 $nin 運算子和 find() 方法查詢文件陣列
  6. 使用 $nin 比較運算子和 update() 方法來更新 MongoDB 中的欄位值
  7. 在 MongoDB 中使用帶有正規表示式的 $nin 運算子
MongoDB 中的 NOT IN 比較運算子

比較運算子在處理大型資料集時非常有用。從資料中獲得洞察力是有幫助的。

本教程介紹如何在 MongoDB 中使用 $nin (NOT IN) 比較運算子。

它還展示瞭如何在 MongoDB 中將 $ninfind()update() 方法一起使用。此外,我們還將學習使用 $nin 運算子的正規表示式。

MongoDB 中的 $nin (NOT IN) 比較運算子

$nin 是 MongoDB 中的比較運算子之一。該運算子選擇那些欄位值不屬於指定陣列的文件,或者該欄位不存在。

如果該欄位包含一個陣列、文件陣列或嵌入文件陣列,那麼我們將僅獲取該欄位包含該陣列且沒有專案等於給定陣列中的值的那些文件(我們稍後也會看到這種情況在本教程中)。

在深入瞭解更多細節之前,讓我們建立包含一些文件的示例集合。

示例程式碼:

db.createCollection('students');
db.students.insertMany([
    {
        "name": {first: "Mehvish", last: "Ashiq"},
        "age": 30,
        "gender": "Female",
        "discipline": "BSCS",
        "joining_year": 2014,
        "department": "Computer Science",
        "courses":[ "Python","Java", "Machine Learning", "Data Science"],
        "contact":[
            { phone: { type: "cell", number: "923042516485" }},
            { mail: { type: "official", email: "mehvishofficial@gmail.com"}}
        ]
    },
    {
        "name": {first: "Aftab", last: "Raza"},
        "age": 25,
        "gender": "Male",
        "discipline": "BSIT",
        "joining_year": 2012,
        "department": "Information Technology",
        "courses":[ "Python","JavaScript", "Information Security"],
        "contact":[
            { phone: { type: "landline", number: "111-444-5555" }},
            { mail: { type: "personal", email: "aftab@hotmail.com"}}
        ]
    }
])

db.students.find().pretty()

輸出:

{
        "_id" : ObjectId("6298ef54271c5124b739d7d3"),
        "name" : {
                "first" : "Mehvish",
                "last" : "Ashiq"
        },
        "age" : 30,
        "gender" : "Female",
        "discipline" : "BSCS",
        "joining_year" : 2014,
        "department" : "Computer Science",
        "courses" : [
                "Python",
                "Java",
                "Machine Learning",
                "Data Science"
        ],
        "contact" : [
                {
                        "phone" : {
                                "type" : "cell",
                                "number" : "923042516485"
                        }
                },
                {
                        "mail" : {
                                "type" : "official",
                                "email" : "mehvishofficial@gmail.com"
                        }
                }
        ]
}
{
        "_id" : ObjectId("6298ef54271c5124b739d7d4"),
        "name" : {
                "first" : "Aftab",
                "last" : "Raza"
        },
        "age" : 25,
        "gender" : "Male",
        "discipline" : "BSIT",
        "joining_year" : 2012,
        "department" : "Information Technology",
        "courses" : [
                "Python",
                "JavaScript",
                "Information Security"
        ],
        "contact" : [
                {
                        "phone" : {
                                "type" : "landline",
                                "number" : "111-444-5555"
                        }
                },
                {
                        "mail" : {
                                "type" : "personal",
                                "email" : "aftab@hotmail.com"
                        }
                }
        ]
}

文件有點複雜的唯一原因是學習使用 $nin 比較運算子與不同的欄位。例如,單個欄位、包含嵌入文件的欄位、包含陣列的欄位以及嵌入文件的陣列。

在 MongoDB 中使用 $nin 運算子和 find() 方法查詢欄位

示例程式碼:

db.students.find({ "joining_year": { $nin: [2011,2014] }}).pretty();

輸出:

{
        "_id" : ObjectId("6298ef54271c5124b739d7d4"),
        "name" : {
                "first" : "Aftab",
                "last" : "Raza"
        },
        "age" : 25,
        "gender" : "Male",
        "discipline" : "BSIT",
        "joining_year" : 2012,
        "department" : "Information Technology",
        "courses" : [
                "Python",
                "JavaScript",
                "Information Security"
        ],
        "contact" : [
                {
                        "phone" : {
                                "type" : "landline",
                                "number" : "111-444-5555"
                        }
                },
                {
                        "mail" : {
                                "type" : "personal",
                                "email" : "aftab@hotmail.com"
                        }
                }
        ]
}

在這個例子中,我們使用 $nin 運算子和 find() 方法來搜尋 joining_year 既不是 2011 也不是 2014 的整個文件。

如果我們只想擁有某些欄位而不是整個文件,我們可以按以下方式使用該命令。寫 1 以在計算機螢幕上列印該欄位及其值,而 0 表示我們不希望該欄位出現在結果集中。

示例程式碼:

db.students.find(
    { "joining_year": { $nin: [2011,2014] }},
    {"name": 1, "discipline": 1, "department": 1, "_id":0}
).pretty();

輸出:

{
        "name" : {
                "first" : "Aftab",
                "last" : "Raza"
        },
        "discipline" : "BSIT",
        "department" : "Information Technology"
}

在 MongoDB 中使用 $nin 運算子和 find() 方法查詢嵌入式文件

示例程式碼:

db.students.find(
    { "name.last": { $nin: ["Raza", "Ali"] }},
    { "name": 1, "gender": 1, "age": 1, "_id":0}
).pretty();

輸出:

{
        "name" : {
                "first" : "Mehvish",
                "last" : "Ashiq"
        },
        "age" : 30,
        "gender" : "Female"
}

對於本教程,示例文件有一個名為 name 的欄位,其中還包含具有兩個欄位(firstlast)的嵌入文件。要將 $nin 比較運算子與 name 欄位一起使用,我們使用點表示法 name.first

對於這個程式碼片段,我們試圖檢索那些 name.last 的值不是 $nin 的指定陣列成員的文件的 nameagegender 運算子。

我們從那些 name.last 既不是 Raza 也不是 Ali 的文件中獲取指定欄位。我們還可以將 AND 條件與 $nin 運算子一起使用。

示例程式碼:

db.students.find(
    { "name.last": { $nin: ["Raza", "Ali"]}, "name.first": {$nin: ["Mehvish"]}},
    { "name": 1, "gender": 1, "age": 1, "_id":0}
).pretty();

這一次,我們不會得到任何輸出,因為我們有兩個文件,其中第一個文件的 Mehvish 作為 name.first 的值,而第二個文件包含 Raza 作為 name.last 欄位的值.因此,這兩個文件都被排除在結果集中,我們什麼也沒得到。

在 MongoDB 中使用 $nin 運算子和 find() 方法中查詢陣列

示例程式碼:

db.students.find(
    { "courses": { $nin: ["JavaScript", "Networking", "Psychology"] }},
    { "courses": 1, "department": 1, "_id":0}
).pretty();

輸出:

{
        "department" : "Computer Science",
        "courses" : [
                "Python",
                "Java",
                "Machine Learning",
                "Data Science"
        ]
}

仔細理解這個輸出。在此輸出中,course 欄位包含一個陣列,其中沒有元素等於 $nin 運算子的給定陣列中的值。

整個文件,其中包含元素等於 JavaScriptNetworkingPsychology 的陣列的任何欄位都將從結果集中排除。

在 MongoDB 中使用 $nin 運算子和 find() 方法查詢文件陣列

仔細觀察我們在本教程開始時填充 students 集合時使用的 contact 欄位。它包含一個文件陣列,其中每個文件都有一個嵌入(巢狀)文件。

如何使用 $nin 運算子進行查詢?請參見下面給出的示例。

db.students.find(
    { "contact.phone.type": { $nin: ["cell"] }},
    { "contact": 1, "department": 1, "_id":0}
).pretty();

輸出:

{
        "department" : "Information Technology",
        "contact" : [
                {
                        "phone" : {
                                "type" : "landline",
                                "number" : "111-444-5555"
                        }
                },
                {
                        "mail" : {
                                "type" : "personal",
                                "email" : "aftab@hotmail.com"
                        }
                }
        ]
}

使用 $nin 比較運算子和 update() 方法來更新 MongoDB 中的欄位值

示例程式碼:

db.students.update(
    { "joining_year": {$nin: [2011,2014]}},
    { $set: {"joining_year": 2000}}
);

在這個程式碼片段中,我們檢索了 joining_year 既不是 2014 也不是 2011 的文件,然後將 joining_year 的值設定為 2000。接下來,使用以下命令檢視更新後的文件。

db.students.find().pretty()

在 MongoDB 中使用帶有正規表示式的 $nin 運算子

示例程式碼:

var array_of_regex = [/Data+/];
db.students.find(
    { "courses": {$nin: array_of_regex}},
    {"name":1, "courses":1, "department":1, "_id":0}
).pretty();

輸出:

{
        "name" : {
                "first" : "Aftab",
                "last" : "Raza"
        },
        "department" : "Information Technology",
        "courses" : [
                "Python",
                "JavaScript",
                "Information Security"
        ]
}

對於這個例子,我們建立了一個可以包含不同正規表示式的陣列。目前,我們只有一個正規表示式。

為什麼我們必須製作一組正規表示式?這是因為 $nin 需要一個陣列來比較。

作者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

相關文章 - MongoDB Operator