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

MongoDB에서 null 값에 따라 필드를 조건부로 선택하는 쿼리 작성법 ($ifNull 연산자)

MongoDB에서 null 값에 따라 필드를 조건부로 선택하기

MongoDB에서 두 개의 필드 중 하나가 null이면 나머지 필드의 값을 선택하고, 둘 다 값이 존재하면 첫 번째 필드의 값을 가져오고 싶은 경우가 있습니다. 이런 조건부 로직은 애그리게이션 파이프라인에서 $ifNull 연산자를 사용하면 간단하게 구현할 수 있습니다.

$ifNull 연산자란?

$ifNull은 MongoDB 애그리게이션 프레임워크에서 제공하는 연산자로, 지정한 표현식의 값이 null이거나 해당 필드 자체가 존재하지 않을 경우 대체 값을 반환합니다. 인수를 배열 형태로 여러 개 전달할 수 있으며, 평가 순서대로 처음 만나는 null이 아닌 값을 결과로 돌려줍니다. 따라서 "둘 다 null이 아니면 첫 번째 필드를 선택한다"는 요구 사항도 자연스럽게 충족됩니다.

예제 컬렉션 생성

먼저 실습에 사용할 컬렉션과 문서를 생성해 보겠습니다.

> db.querySelectDemo.insertOne({"Value1":10,"Value2":null});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cefc0ceef71edecf6a1f6b6")
}
> db.querySelectDemo.insertOne({"Value1":null,"Value2":30});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cefc0d7ef71edecf6a1f6b7")
}
> db.querySelectDemo.insertOne({"Value1":60,"Value2":40});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cefc0e2ef71edecf6a1f6b8")
}

세 개의 문서에는 각각 다음과 같은 조합이 담겨 있습니다.

  • 첫 번째 문서: Value1에만 값(10)이 있고 Value2는 null
  • 두 번째 문서: Value1이 null이고 Value2에만 값(30)이 있음
  • 세 번째 문서: 두 필드 모두 값(60, 40)이 존재함

저장된 문서 조회하기

find() 메서드를 사용해 컬렉션의 모든 문서를 확인할 수 있습니다.

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

출력 결과

{
   "_id" : ObjectId("5cefc0ceef71edecf6a1f6b6"),
   "Value1" : 10,
   "Value2" : null
}
{
   "_id" : ObjectId("5cefc0d7ef71edecf6a1f6b7"),
   "Value1" : null,
   "Value2" : 30
}
{
   "_id" : ObjectId("5cefc0e2ef71edecf6a1f6b8"),
   "Value1" : 60,
   "Value2" : 40
}

$ifNull을 활용한 조건부 필드 선택 쿼리

다음은 Value1이 null이면 Value2의 값을 대신 선택하고, Value1에 값이 있으면 그대로 Value1을 반환하는 쿼리입니다. $project 단계 안에서 $ifNull을 적용합니다.

> db.querySelectDemo.aggregate([
   {
      $project: {
         "Value1": { "$ifNull": [ "$Value1", "$Value2" ] }
      }
   }
]);

쿼리 실행 결과

{ "_id" : ObjectId("5cefc0ceef71edecf6a1f6b6"), "Value1" : 10 }
{ "_id" : ObjectId("5cefc0d7ef71edecf6a1f6b7"), "Value1" : 30 }
{ "_id" : ObjectId("5cefc0e2ef71edecf6a1f6b8"), "Value1" : 60 }

결과 분석

  • 첫 번째 문서: Value1이 10으로 null이 아니므로 그대로 10이 반환됩니다.
  • 두 번째 문서: Value1이 null이므로 배열의 다음 인수인 Value2의 값 30으로 대체됩니다.
  • 세 번째 문서: 두 필드 모두 값이 있지만, $ifNull은 항상 첫 번째(null이 아닌) 인수를 우선 반환하므로 Value1의 값 60이 선택됩니다.

정리 및 참고 사항

$ifNull은 인수 목록에서 왼쪽부터 차례로 평가하여 처음으로 null이 아닌 값을 반환하는 동작 방식을 가집니다. 이 특성 덕분에 복잡한 조건문 없이도 "기본값 설정", "누락된 데이터 보완" 같은 요구 사항을 손쉽게 처리할 수 있습니다. 세 개 이상의 필드를 대상으로 하는 폴백(fallback) 로직이 필요하더라도 { "$ifNull": [ "$A", "$B", "$C", "기본값" ] }처럼 인수를 계속 추가하기만 하면 되므로 확장성도 뛰어납니다.