MongoDB 從陣列中刪除元素

Mehvish Ashiq 2023年1月30日
  1. MongoDB 從陣列中刪除元素
  2. 使用 MongoDB $pull 從文件陣列中刪除元素
  3. 使用 MongoDB $pullAll 從陣列中刪除元素
  4. 使用 MongoDB $pop 從陣列中刪除元素
  5. 使用 MongoDB $unset 刪除包含給定元素的欄位
  6. 使用 MongoDB 位置運算子將元素設定為 null 而不是刪除
MongoDB 從陣列中刪除元素

我們可以根據專案要求採用不同的方法。今天,我們將學習如何在工作時使用 $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 運算子從現有陣列中刪除給定值的所有出現(例項)。例如,如果數字 8scores 陣列中出現兩次,則兩個 8 值都將被刪除。

就像 $pull 運算子通過指定過濾查詢來刪除陣列元素一樣,$pullAll 刪除/刪除與列出的值匹配的陣列元素。

我們使用點符號來處理陣列的嵌入文件。

使用 MongoDB $pop 從陣列中刪除元素

如果我們有興趣從陣列中刪除第一個或最後一個元素,我們可以使用 $pop 運算子。為此,我們將 -11 傳遞給 $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

當我們不知道陣列元素的位置時,可以使用這種方法。另一方面,如果我們想更新給定陣列欄位中的所有元素,我們也可以使用 $[](所有位置運算子)。

作者: 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 Array

相關文章 - MongoDB Document