使用 MongoDB $Pull 刪除陣列中的文件

Shihab Sikder 2023年1月30日
  1. MongoDB $pull 運算子
  2. 帶有條件的 MongoDB $pull 命令
  3. 在巢狀陣列中使用 $pull
使用 MongoDB $Pull 刪除陣列中的文件

$pull 運算子可以從陣列中獲取任何現有專案。你可以從陣列中提取一個或多個元素。

你可以從巢狀陣列中刪除任何特定物件。

MongoDB $pull 運算子

$pull 在 MongoDB 中用於從陣列中刪除現有元素。 $pullupdate 查詢一起使用。

這是一個例子。我們插入了以下內容。

db.cart.insertMany( [
   {
      _id: 1,
      grocery:["biscuits", "oil", "honey", "milk", "paper"],
      electronics:["earphone", "bluetooth", "mouse", "keyboard"]
   },
   {
      _id: 2,
      grocery:["biscuits", "oil", "soda", "water", "paper"],
      electronics:["pendrive", "motherboard", "mouse", "SSD"]
   }
] )

這裡有兩個購物車。假設商店沒有 paperSSDmouse 的庫存。

因此,你想從購物車中刪除這些產品。然後,你可以使用 $pull 運算子使用以下查詢。

db.cart.updateMany({},
    {
        $pull:{ grocery: "paper",  electronics:{ $in:[ "SSD","mouse" ] } }
    }
)

$in 運算子采用一個陣列來匹配每個元素與文件。完成此操作後,集合將如下所示。

{
      _id: 1,
      grocery:["biscuits", "oil", "honey", "milk"],
      electronics:["earphone", "bluetooth", "keyboard"]
   },
   {
      _id: 2,
      grocery:["biscuits", "oil", "soda", "water"],
      electronics:["pendrive", "motherboard"]
   }

帶有條件的 MongoDB $pull 命令

假設我們有以下文件。

{
    _id: 1,
    price: [ 31, 50, 55, 66, 98, 25 ]
},
{
    _id: 2,
    price: [ 51, 55, 65, 91, 19, 26 ]
},

現在,你要刪除 price 陣列中值大於 50 的元素。然後命令將如下所示。

db.products.updateMany(
    {},
    { $pull: { price:{ $gte : 50} } }
)

你將看到我們使用 {} 作為 updateMany 的第一個引數。這是因為我們要更新所有元素。

假設你只想更新一些特定的 _id,那麼命令將如下所示。

db.products.updateMany(
    {_id: 1},
    { $pull: { price:{ $gte : 50} } }
)

你也可以使用 _id 中的 $in 運算子選擇多個 _id 進行更新並使用 pull 操作。

在巢狀陣列中使用 $pull

假設你有以下文件集合。

db.survey.drop()

db.survey.insertMany( [
   {
      _id: 1,
      results: [
         {
            item: "A",
            score: 5,
            answers: [ { q: 1, a: 4 }, { q: 2, a: 6 } ]
         },
         {
            item: "B",
            score: 8,
            answers: [ { q: 1, a: 8 }, { q: 2, a: 9 } ]
         }
      ]
   },
   {
      _id: 2,
      results: [
         {
            item: "C",
            score: 8,
            answers: [ { q: 1, a: 8 }, { q: 2, a: 7 } ]
         },
         {
            item: "B",
            score: 4,
            answers: [ { q: 1, a: 0 }, { q: 2, a: 8 } ]
         }
      ]
   }
] )

我們想從 results 陣列中刪除那些 q 等於 2 且 a 大於等於 8 的專案。然後查詢將是:

db.survey.updateMany(
  { },
  {
     $pull:
        {
           results:
              {
                 answers: { $elemMatch: { q: 2, a: { $gte: 8 } } }
              }
        }
  }
)

此操作後,更新後的集合將如下所示:

{
  _id: 1,
  results: [
    {
      item: 'A',
      score: 5,
      answers: [ { q: 1, a: 4 }, { q: 2, a: 6 } ]
    }
  ]
},
{
  _id: 2,
  results: [
    {
      item: 'C',
      score: 8,
      answers: [ { q: 1, a: 8 }, { q: 2, a: 7 } ]
    }
  ]
}

這個巢狀陣列示例取自 MongoDB 的官方文件。在這裡你可以閱讀完整的文件並瞭解有關 $pull 運算子的更多資訊。

作者: Shihab Sikder
Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website