MongoDB에서 배열(Array) 필드 안에 포함된 null 값을 제거해야 하는 경우가 종종 있습니다. 이럴 때 $pull 연산자를 사용하면 간단하게 해결할 수 있습니다. 이 글에서는 실제 예제를 통해 MongoDB 배열에서 null 요소를 삭제하는 방법을 단계별로 살펴보겠습니다.
1. 테스트용 컬렉션 생성하기
먼저 null 값이 포함된 문서를 가진 컬렉션을 생성합니다. 아래 예제에서는 학생 정보를 담는 StudentDetails 배열에 의도적으로 null 요소를 추가했습니다.
> db.removeNullDemo.insertOne(
... {
... "_id" : 1,
... "StudentDetails" : [
... {
... "FirstName": "John",
... "LastName":"Smith",
... },
... {
... "Age":21
... },
... null
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 1 }두 번째 문서에는 null 값이 없는 상태로 삽입합니다.
> db.removeNullDemo.insertOne(
... {
... "_id" : 2,
... "StudentDetails" : [
... {
... "FirstName": "Carol",
... "LastName":"Taylor",
... },
... {
... "Age":23
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 2 }2. 현재 저장된 문서 확인하기
find() 메서드와 pretty() 메서드를 함께 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.removeNullDemo.find().pretty();
실행 결과는 다음과 같습니다. 첫 번째 문서의 배열 끝에 null이 그대로 남아 있는 것을 확인할 수 있습니다.
{
"_id" : 1,
"StudentDetails" : [
{
"FirstName" : "John",
"LastName" : "Smith"
},
{
"Age" : 21
},
null
]
}
{
"_id" : 2,
"StudentDetails" : [
{
"FirstName" : "Carol",
"LastName" : "Taylor"
},
{
"Age" : 23
}
]
}3. $pull 연산자로 null 요소 제거하기
이제 핵심 단계입니다. $pull 연산자를 사용하면 조건에 일치하는 배열 요소를 손쉽게 삭제할 수 있습니다. 여기서는 조건값으로 null을 지정하여 배열 내의 모든 null 요소를 제거합니다.
> db.removeNullDemo.update({_id:1},{$pull:{StudentDetails:null}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })실행 결과에서 nModified : 1이 반환되면, 하나의 문서가 성공적으로 수정되었다는 의미입니다.
4. 결과 검증하기
null 값이 실제로 제거되었는지 다시 한번 확인해 보겠습니다.
> db.removeNullDemo.find().pretty();
출력 결과를 보면 첫 번째 문서의 StudentDetails 배열에서 null이 깔끔하게 사라진 것을 알 수 있습니다.
{
"_id" : 1,
"StudentDetails" : [
{
"FirstName" : "John",
"LastName" : "Smith"
},
{
"Age" : 21
}
]
}
{
"_id" : 2,
"StudentDetails" : [
{
"FirstName" : "Carol",
"LastName" : "Taylor"
},
{
"Age" : 23
}
]
}정리
MongoDB 배열에서 null 요소를 제거하는 방법은 매우 간단합니다. 핵심은 $pull 연산자에 null을 조건으로 지정하는 것입니다.
$pull: { 필드명: null }형태로 작성하면 해당 배열의 모든 null 요소가 삭제됩니다.- 특정 문서만 수정하려면
update()의 첫 번째 인자에 조건(예:{_id:1})을 지정하면 됩니다. - 컬렉션 전체에 적용하고 싶다면 조건을 비우고
multi: true옵션을 활용할 수도 있습니다.
참고로 MongoDB 4.2 이상 버전에서는 updateOne(), updateMany() 같은 최신 업데이트 메서드를 사용하는 것이 권장되므로, 실무 환경이라면 db.removeNullDemo.updateMany({}, {$pull:{StudentDetails:null}}) 형태로 작성하는 것도 좋은 선택입니다.