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 조건을 함께 사용하면 배열 내부의 빈 객체를 손쉽게 정리할 수 있습니다. 데이터 품질 관리나 스키마 정리 작업 시 유용하게 활용해 보시기 바랍니다.