MongoDB $ifNull 연산자란?
MongoDB의 $ifNull 연산자는 지정한 표현식을 평가하여, 그 결과가 null이 아니면 해당 값을 그대로 반환하고, null이거나 필드 자체가 존재하지 않으면 미리 정의한 대체 값을 반환합니다. 주로 집계 파이프라인의 $project 단계에서 누락된 데이터나 null 값에 기본값을 채워 넣을 때 매우 유용하게 사용됩니다.
샘플 컬렉션 생성하기
먼저 실습에 사용할 문서들을 담은 컬렉션을 생성해 보겠습니다.
> db.demo372.insertOne({"FirstName":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e591aea2ae06a1609a00af6")
}
> db.demo372.insertOne({"FirstName":null});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e591aef2ae06a1609a00af7")
}
> db.demo372.insertOne({"FirstName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e591af42ae06a1609a00af8")
}
> db.demo372.insertOne({"FirstName":null});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e591afb2ae06a1609a00af9")
}위 예제에서는 이름(FirstName)이 있는 문서 두 개와 값이 null인 문서 두 개를 삽입했습니다.
find() 메서드로 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo372.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e591aea2ae06a1609a00af6"), "FirstName" : "Chris" }
{ "_id" : ObjectId("5e591aef2ae06a1609a00af7"), "FirstName" : null }
{ "_id" : ObjectId("5e591af42ae06a1609a00af8"), "FirstName" : "David" }
{ "_id" : ObjectId("5e591afb2ae06a1609a00af9"), "FirstName" : null }출력 결과를 보면 두 개의 문서에서 FirstName 필드가 null로 저장되어 있는 것을 확인할 수 있습니다.
$ifNull을 활용한 집계 쿼리 작성하기
이제 $project 단계와 함께 $ifNull을 사용하여 null 값을 다른 문자열로 대체해 보겠습니다.
> db.demo372.aggregate(
... [
... {
... $project:
... {
... FirstName: { $ifNull: [ "$FirstName", "NOT PROVIDED" ] }
... }
... }
... ]
... )위 쿼리는 FirstName 필드의 값을 확인하고, 값이 null이면 "NOT PROVIDED"라는 기본값으로 대체합니다. 실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e591aea2ae06a1609a00af6"), "FirstName" : "Chris" }
{ "_id" : ObjectId("5e591aef2ae06a1609a00af7"), "FirstName" : "NOT PROVIDED" }
{ "_id" : ObjectId("5e591af42ae06a1609a00af8"), "FirstName" : "David" }
{ "_id" : ObjectId("5e591afb2ae06a1609a00af9"), "FirstName" : "NOT PROVIDED" }결과 분석
출력 결과를 보면 원래 값이 있던 "Chris"와 "David"는 그대로 유지되고, null이었던 두 문서는 "NOT PROVIDED"로 변경된 것을 확인할 수 있습니다. 이처럼 $ifNull은 배열 형태로 [ 검사할 필드, 대체값 ]을 받아 동작하며, 여러 필드를 순차적으로 검사하도록 세 개 이상의 인수를 전달할 수도 있습니다. 이 경우 마지막 인수가 모든 값이 null일 때 반환되는 최종 기본값 역할을 합니다.