MongoDB 中的 NOT IN 比較運算子
-
MongoDB 中的
$nin
(NOT IN
) 比較運算子 -
在 MongoDB 中使用
$nin
運算子和find()
方法查詢欄位 -
在 MongoDB 中使用
$nin
運算子和find()
方法查詢嵌入式文件 -
在 MongoDB 中使用
$nin
運算子和find()
方法中查詢陣列 -
在 MongoDB 中使用
$nin
運算子和find()
方法查詢文件陣列 -
使用
$nin
比較運算子和update()
方法來更新 MongoDB 中的欄位值 -
在 MongoDB 中使用帶有正規表示式的
$nin
運算子
比較運算子在處理大型資料集時非常有用。從資料中獲得洞察力是有幫助的。
本教程介紹如何在 MongoDB 中使用 $nin
(NOT IN
) 比較運算子。
它還展示瞭如何在 MongoDB 中將 $nin
與 find()
和 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
的欄位,其中還包含具有兩個欄位(first
和 last
)的嵌入文件。要將 $nin
比較運算子與 name
欄位一起使用,我們使用點表示法 name.first
。
對於這個程式碼片段,我們試圖檢索那些 name.last
的值不是 $nin
的指定陣列成員的文件的 name
、age
和 gender
運算子。
我們從那些 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
運算子的給定陣列中的值。
整個文件,其中包含元素等於 JavaScript
、Networking
或 Psychology
的陣列的任何欄位都將從結果集中排除。
在 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
需要一個陣列來比較。