MongoDB 從陣列中刪除元素
- MongoDB 從陣列中刪除元素
-
使用 MongoDB
$pull
從文件陣列中刪除元素 -
使用 MongoDB
$pullAll
從陣列中刪除元素 -
使用 MongoDB
$pop
從陣列中刪除元素 -
使用 MongoDB
$unset
刪除包含給定元素的欄位 -
使用 MongoDB 位置運算子將元素設定為
null
而不是刪除
我們可以根據專案要求採用不同的方法。今天,我們將學習如何在工作時使用 $pull
、$pullAll
、$pop
、$unset
和位置運算子 ($
) 從陣列或文件陣列中刪除元素在 MongoDB 中。
MongoDB 從陣列中刪除元素
我們必須有一個示例文件集合來練習所有提到的方法。我們將建立一個名為 collection
的集合並僅插入一個文件。
你也可以使用下面的 collection
,其中包含一個文件。
示例程式碼:
// MongoDB version 5.0.8
> db.collection.insertMany([
{
contact: {
phone: [
{"type" : "UAN", "number" : "123456789"},
{"type" : "office", "number" : "987546321"},
{"type" : "personal", "number" : "852147963"}
]
},
services: ["Google", "Instagram", "Twitter", "Facebook"],
scores: [ 0, 1, 8, 17, 18, 8, 20, 10 ]
},
{
contact: {
phone: [
{"type" : "UAN", "number" : "456321879"},
{"type" : "office", "number" : "874596321"},
{"type" : "personal", "number" : "964785123"}
]
},
services: ["Google", "Instagram", "Twitter"],
scores: [ 1, 8, 2, 3, 8, 7, 1 ]
}
]);
如果你沒有名為 collection
的集合,請不要擔心;上面的查詢將為你建立並填充它。接下來,你可以執行 db.collection.find().pretty()
來檢視插入的文件。
請記住,在執行接下來的程式碼示例後,你將看不到更新的文件。為此,你必須執行 db.collection.find().pretty()
命令。
使用 MongoDB $pull
從文件陣列中刪除元素
示例程式碼:
// MongoDB version 5.0.8
> db.collection.update(
{ _id : ObjectId("62aae796f27219958a489b89") },
{ $pull : { "contact.phone": { "number": "987546321" } } }
);
輸出:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "UAN", "number" : "123456789" },
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Google", "Instagram", "Twitter", "Facebook" ],
"scores" : [ 0, 1, 8, 17, 18, 8, 20, 10 ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "UAN", "number" : "456321879" },
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Google", "Instagram", "Twitter" ],
"scores" : [ 1, 8, 2, 3, 8, 7, 1 ]
}
在這裡,我們使用 $pull
運算子從現有陣列中刪除與過濾器查詢或指定條件匹配的值/值的所有例項。
在上面的程式碼示例中,我們正在搜尋 _id
等於 ObjectId("62aae796f27219958a489b89")
的文件。一旦文件符合指定條件,我們就從現有陣列中刪除例項,其中 contact.phone.number
等於 987546321
。
使用 $pull
運算子時請記住以下幾點。
- 如果需要刪除的給定
value
是一個陣列,則$pull
運算子僅從完全滿足給定value
的陣列中刪除元素(包括順序)。 - 如果需要刪除的給定
值
是文件,則$pull
運算子僅從包含確切欄位和值的陣列中刪除元素。欄位的順序在此處可能有所不同。 - 如果給定的
條件
和陣列的元素是嵌入文件,則$pull
運算子將應用條件
,就好像每個陣列元素都是集合中的文件一樣。有關這方面的更多詳細資訊,你可以檢視 this。
現在,我們有另一種情況,我們想要對集合中的所有文件執行 remove
操作。為此,我們使用 $pull
使用以下語法,而 {multi: true}
對指定條件的所有文件進行操作。
示例程式碼:
// MongoDB version 5.0.8
> db.collection.update({},
{ $pull: { "contact.phone": { "type": "UAN" } } },
{ multi: true }
);
輸出:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Google", "Instagram", "Twitter", "Facebook" ],
"scores" : [ 0, 1, 8, 17, 18, 8, 20, 10 ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Google", "Instagram", "Twitter" ],
"scores" : [ 1, 8, 2, 3, 8, 7, 1 ]
}
為了獲得上述輸出,我們從集合中的所有文件中刪除陣列元素,其中 contact.phone.type
等於 "UAN"
。
我們的下一個任務是從 scores
陣列中刪除值大於或等於 2
且小於或等於 6
(2 <= value <= 6
) 的元素。對所選集合的所有文件執行以下查詢。
示例程式碼:
// MongoDB version 5.0.8
> db.collection.update(
{},
{ $pull : { scores : {$gte: 2, $lte: 6} } },
{ multi: true }
)
輸出:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Google", "Instagram", "Twitter", "Facebook" ],
"scores" : [ 0, 1, 8, 17, 18, 8, 20, 10 ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Google", "Instagram", "Twitter" ],
"scores" : [ 1, 8, 8, 7, 1 ]
}
要練習使用字串型別的值,我們可以通過以下方式進行。
示例程式碼:
// MongoDB version 5.0.8
> db.collection.update(
{},
{ $pull: { "services": { $in: [ "Google", "Instagram" ] }, "scores": 1 } },
{ multi: true }
)
輸出:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Twitter", "Facebook" ],
"scores" : [ 0, 8, 17, 18, 8, 20, 10 ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Twitter" ],
"scores" : [ 8, 8, 7 ]
}
對於此程式碼示例,我們使用 $in
比較運算子來獲取一個值陣列,如果存在任何值,則將它們從 services
陣列中刪除。
此外,當我們使用 $pull
運算子執行所有這些刪除操作時,我們從 scores
陣列中刪除 1
如果它在那裡。
使用 MongoDB $pullAll
從陣列中刪除元素
示例程式碼:
// MongoDB version 5.0.8
> db.collection.update(
{ _id: ObjectId("62aae796f27219958a489b8a") },
{ $pullAll: { "scores": [8] } }
)
輸出:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Twitter", "Facebook" ],
"scores" : [ 0, 8, 17, 18, 8, 20, 10 ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Twitter" ],
"scores" : [ 7 ]
}
對於此程式碼,我們使用 $pullAll
運算子從現有陣列中刪除給定值的所有出現(例項)。例如,如果數字 8
在 scores
陣列中出現兩次,則兩個 8
值都將被刪除。
就像 $pull
運算子通過指定過濾查詢來刪除陣列元素一樣,$pullAll
刪除/刪除與列出的值匹配的陣列元素。
我們使用點符號來處理陣列的嵌入文件。
使用 MongoDB $pop
從陣列中刪除元素
如果我們有興趣從陣列中刪除第一個或最後一個元素,我們可以使用 $pop
運算子。為此,我們將 -1
或 1
傳遞給 $pop
運算子以從第一個或最後一個刪除陣列元素。
示例程式碼:
// MongoDB version 5.0.8
> db.collection.update(
{ _id: ObjectId("62aae796f27219958a489b89") },
{ $pop: { "scores": -1 } }
)
輸出:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Twitter", "Facebook" ],
"scores" : [ 8, 17, 18, 8, 20, 10 ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Twitter" ],
"scores" : [ 7 ]
}
使用 MongoDB $unset
刪除包含給定元素的欄位
示例程式碼:
// MongoDB version 5.0.8
> db.collection.update(
{ _id : ObjectId("62aae796f27219958a489b89") },
{ $unset : {"scores" : 8 }}
)
輸出:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Twitter", "Facebook" ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Twitter" ],
"scores" : [ 7 ]
}
在這裡,我們使用 $unset
運算子來刪除包含給定值的特定欄位。例如,我們正在刪除匹配過濾器查詢幷包含 8
作為陣列元素的 scores
欄位。
請記住,當我們將 $unset
運算子與位置運算子 ($
) 一起使用時,它不會刪除匹配的元素,而是將其設定為 null
。請參閱以下部分進行練習。
使用 MongoDB 位置運算子將元素設定為 null
而不是刪除
示例程式碼:
// MongoDB version 5.0.8
> db.collection.update(
{"services": "Facebook"},
{ $unset: {"services.$" : 1}}
)
輸出:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Twitter", null ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Twitter" ],
"scores" : [ 7 ]
}
此程式碼片段使用 $unset
和位置運算子將陣列元素設定為 null
而不是刪除它。我們使用 $
來更新陣列的第一個元素,其中 services
陣列中的值為 Facebook
。
當我們不知道陣列元素的位置時,可以使用這種方法。另一方面,如果我們想更新給定陣列欄位中的所有元素,我們也可以使用 $[]
(所有位置運算子)。