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

여기 두 개의 장바구니가 있습니다. 상점에 paper, SSD 또는 mouse에 대한 재고가 없다고 가정해 보겠습니다.

따라서 장바구니에서 이러한 제품을 제거하려고 합니다. 그런 다음 $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 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