MongoDB에서 두 개의 필드 중 하나가 null일 때 나머지 필드의 값을 선택하고 싶다면, 집계 파이프라인에서 $ifNull 연산자를 사용하면 됩니다. $ifNull은 첫 번째 표현식이 null이거나 필드가 존재하지 않을 경우 대체 값을 반환해 주는 아주 유용한 연산자입니다.
1. 샘플 컬렉션 생성하기
먼저 실습용 컬렉션에 문서를 삽입해 보겠습니다.
> db.demo182.insertOne({"FirstName":"Chris","LastName":null});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e398ea19e4f06af55199802")
}
> db.demo182.insertOne({"FirstName":null,"LastName":"Miller"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e398ead9e4f06af55199803")
}
> db.demo182.insertOne({"FirstName":"John","LastName":"Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e398ebf9e4f06af55199804")
}위 예제에서는 세 개의 문서를 생성했습니다. 첫 번째 문서는 LastName이 null이고, 두 번째 문서는 FirstName이 null이며, 세 번째 문서는 두 필드 모두 값이 존재합니다.
2. find()로 전체 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo182.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e398ea19e4f06af55199802"), "FirstName" : "Chris", "LastName" : null }
{ "_id" : ObjectId("5e398ead9e4f06af55199803"), "FirstName" : null, "LastName" : "Miller" }
{ "_id" : ObjectId("5e398ebf9e4f06af55199804"), "FirstName" : "John", "LastName" : "Smith" }3. $ifNull을 활용한 쿼리 작성하기
이제 한 필드가 null일 때 다른 필드의 값을 선택하는 쿼리를 작성해 보겠습니다. aggregate()와 함께 $project 단계 안에서 $ifNull을 사용합니다.
> db.demo182.aggregate([
... {
... $project: {
... "item": 1,
... "Result": { "$ifNull": [ "$FirstName", "$LastName" ] }
... }
... }
...])$ifNull은 배열 형태로 인자를 받으며, 첫 번째 요소인 $FirstName이 null이면 두 번째 요소인 $LastName의 값이 대신 반환됩니다.
쿼리 실행 결과
{ "_id" : ObjectId("5e398ea19e4f06af55199802"), "Result" : "Chris" }
{ "_id" : ObjectId("5e398ead9e4f06af55199803"), "Result" : "Miller" }
{ "_id" : ObjectId("5e398ebf9e4f06af55199804"), "Result" : "John" }결과 분석
- 첫 번째 문서: FirstName이 "Chris"이므로 그대로 "Chris"가 출력됩니다.
- 두 번째 문서: FirstName이 null이므로 LastName인 "Miller"가 대체되어 출력됩니다.
- 세 번째 문서: FirstName이 "John"이므로 "John"이 출력됩니다.
이처럼 $ifNull 연산자를 사용하면 null 값 처리 로직을 간결하게 구현할 수 있습니다. 참고로 $ifNull은 세 번째 이상의 인자도 허용하며, 앞의 값들이 모두 null일 경우 순차적으로 다음 값을 확인한 뒤 마지막 기본값을 반환할 수도 있습니다.