Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 배열 요소(문서)를 제거하는 방법 – $pull 연산자 완벽 가이드

MongoDB에서 배열에 저장된 요소, 즉 내장 문서(embedded document)를 제거하고 싶다면 $pull 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 $pull 연산자의 사용법을 단계별로 살펴보겠습니다.

1. 테스트용 컬렉션 생성하기

먼저 학생 정보를 담고 있는 배열 필드를 포함한 문서로 컬렉션을 생성해 보겠습니다.

> db.pullAnArrayElementDemo.insertOne(
  {
    "StudentDetails": [
      { "StudentFirstName": "Chris", "StudentScore": 56 },
      { "StudentFirstName": "Robert", "StudentScore": 59 }
    ]
  }
);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd3b55bedc6604c74817cd5")
}

2. 현재 저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.

> db.pullAnArrayElementDemo.find().pretty();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : ObjectId("5cd3b55bedc6604c74817cd5"),
   "StudentDetails" : [
      {
         "StudentFirstName" : "Chris",
         "StudentScore" : 56
      },
      {
         "StudentFirstName" : "Robert",
         "StudentScore" : 59
      }
   ]
}

현재 StudentDetails 배열 안에 Chris와 Robert 두 개의 학생 문서가 들어있는 것을 확인할 수 있습니다.

3. $pull 연산자로 배열 요소 제거하기

이제 $pull 연산자를 사용해 배열에서 특정 조건에 맞는 요소(문서)를 제거해 보겠습니다. 여기서는 이름이 'Chris'인 학생 문서를 삭제합니다.

> db.pullAnArrayElementDemo.update(
  {},
  { $pull: { 'StudentDetails': { 'StudentFirstName': 'Chris' } } }
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

nModified : 1이 반환되었으므로, 하나의 문서에서 해당 배열 요소가 성공적으로 제거된 것입니다.

$pull 연산자 동작 원리: $pull은 지정한 조건과 일치하는 모든 배열 요소를 한 번에 제거합니다. 조건 객체가 일치하려면 배열 내 문서의 필드 값이 정확히 일치해야 하며, 부분 일치만으로는 제거되지 않습니다.

4. 삭제 후 결과 확인하기

변경 사항이 정상적으로 적용되었는지 다시 한번 전체 문서를 조회해 보겠습니다.

> db.pullAnArrayElementDemo.find().pretty();

실행 결과는 다음과 같습니다.

{
   "_id" : ObjectId("5cd3b55bedc6604c74817cd5"),
   "StudentDetails" : [
      {
         "StudentFirstName" : "Robert",
         "StudentScore" : 59
      }
   ]
}

'Chris'에 해당하는 배열 요소가 사라지고 'Robert' 문서만 남아 있는 것을 확인할 수 있습니다.

정리

MongoDB에서 배열 내부의 문서 요소를 제거할 때는 $pull 연산자가 가장 간단하고 직관적인 방법입니다. 핵심 문법은 다음과 같습니다.

db.컬렉션명.update(
  { 검색조건 },
  { $pull: { "배열필드명": { "제거할_필드": "값" } } }
)

참고로 최신 MongoDB 버전에서는 update() 대신 updateOne(), updateMany() 메서드를 사용하는 것이 권장됩니다. 또한 조건에 정규식이나 비교 연산자($gt, $lt 등)를 함께 사용하면 더욱 유연하게 배열 요소를 제거할 수 있습니다.