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

MongoDB 배열에서 빈 객체를 제거하는 방법 – $pull 연산자 활용 가이드

MongoDB에서 배열 안에 포함된 빈 객체({})를 제거해야 할 때는 $pull 연산자를 사용하면 간단하게 해결할 수 있습니다. 이 글에서는 실제 예제를 통해 배열 내 빈 객체를 삭제하는 전체 과정을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 테스트용 컬렉션을 만들고 문서를 삽입합니다. 아래 예제의 UserDetails 배열에는 의도적으로 빈 객체 하나가 포함되어 있습니다.

> db.removeEmptyObjectsDemo.insertOne(
    {
       "_id" : 101,
       "LoginDate" : new ISODate(),
       "UserDetails" : [
          {
             "UserName" : "John"
          },
          {
          },
          {
             "UserName" : "Sam"
          }
       ]
    }
);
{ "acknowledged" : true, "insertedId" : 101 }

2. 현재 문서 확인하기

find() 메서드를 사용해 컬렉션에 저장된 모든 문서를 조회해 보겠습니다.

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

실행 결과는 다음과 같습니다. UserDetails 배열 중간에 필드가 없는 빈 객체가 그대로 남아 있는 것을 확인할 수 있습니다.

{
    "_id" : 101,
    "LoginDate" : ISODate("2019-05-25T04:46:29.505Z"),
    "UserDetails" : [
       {
          "UserName" : "John"
       },
       {
       },
       {
          "UserName" : "Sam"
       }
    ]
}

3. $pull 연산자로 빈 객체 제거하기

빈 객체를 제거하는 핵심은 $pull$exists 조건의 조합입니다. 특정 필드(여기서는 UserName)이 존재하지 않는 요소, 즉 빈 객체를 배열에서 pulling(제거)하는 방식입니다.

> db.removeEmptyObjectsDemo.update(
{},
{ "$pull": { "UserDetails": { "UserName": { "$exists": false } } } },
{ "multi": true }
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

쿼리 구성 요소를 살펴보면 다음과 같습니다.

  • 첫 번째 인수 {}: 모든 문서를 대상으로 지정합니다.
  • $pull: 조건에 일치하는 배열 요소를 제거하는 업데이트 연산자입니다.
  • $exists: false: UserName 필드가 없는 요소, 즉 빈 객체만 선택합니다.
  • multi: true: 조건에 일치하는 모든 문서에 업데이트를 적용합니다.

4. 결과 검증하기

업데이트 후 다시 문서를 조회하여 빈 객체가 정상적으로 제거되었는지 확인합니다.

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

실행 결과는 다음과 같습니다. 빈 객체가 성공적으로 제거된 것을 볼 수 있습니다.

{
    "_id" : 101,
    "LoginDate" : ISODate("2019-05-25T04:46:29.505Z"),
    "UserDetails" : [
       {
          "UserName" : "John"
       },
       {
          "UserName" : "Sam"
       }
    ]
}

마무리

이처럼 MongoDB에서는 $pull 연산자와 $exists: false 조건을 함께 사용하면 배열 내부의 빈 객체를 손쉽게 정리할 수 있습니다. 데이터 품질 관리나 스키마 정리 작업 시 유용하게 활용해 보시기 바랍니다.