MongoDB $Pull を使用して、アレイ内のドキュメントを削除する

Shihab Sikder 2023年1月30日
  1. MongoDB $pull 演算子
  2. MongoDB $pull 条件付きコマンド
  3. ネストされた配列で $pull を使用する
MongoDB $Pull を使用して、アレイ内のドキュメントを削除する

$pull 演算子は、配列から既存のアイテムをフェッチできます。配列から 1つ以上の要素をプルできます。

ネストされた配列から特定のオブジェクトを削除できます。

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"]
   }
] )

これが 2つのショッピングカートです。SSD、またはマウスの在庫がない場合を考えてみましょう。

したがって、これらの製品をショッピングカートから削除する必要があります。次に、$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 ]
},

ここで、値が 50 より大きい price 配列の要素を削除します。コマンドは次のようになります。

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 } ]
         }
      ]
   }
] )

q が 2 で、a が 8 より大きい results 配列からこれらの項目を削除します。クエリは次のようになります。

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