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

필드 존재 여부에 따라 MongoDB 집계 파이프라인에서 $cond로 조건 필드 구현하기

개요

MongoDB에서 특정 필드의 존재 여부에 따라 새로운 값을 만들어야 하는 경우가 자주 있습니다. 이럴 때 $cond 연산자와 $anyElementTrue 연산자를 함께 사용하면 손쉽게 해결할 수 있습니다.

$anyElementTrue는 배열 내 요소 중 하나라도 true로 평가되면 true를 반환합니다. 여기서 중요한 점은 다음과 같습니다.

  • 필드가 존재하지 않거나 값이 null이면 false로 평가됩니다.
  • 빈 배열([]) 역시 $anyElementTrue에서 false를 반환합니다.

샘플 컬렉션 생성

먼저 예제에 사용할 문서들을 담은 컬렉션을 생성해 보겠습니다. StudentName 필드가 null인 문서와 실제 이름이 있는 문서를 섞어서 삽입합니다.

> db.presenceDemo.insertOne({"StudentName":null});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e06f70c25ddae1f53b621f3")
}
> db.presenceDemo.insertOne({"StudentName":"Chris"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e06f71425ddae1f53b621f4")
}
> db.presenceDemo.insertOne({"StudentName":null});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e06f71825ddae1f53b621f5")
}
> db.presenceDemo.insertOne({"StudentName":"David"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e06f71e25ddae1f53b621f6")
}

전체 문서 조회하기

find() 메서드를 사용하여 컬렉션의 모든 문서를 확인합니다.

> db.presenceDemo.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e06f70c25ddae1f53b621f3"), "StudentName" : null }
{ "_id" : ObjectId("5e06f71425ddae1f53b621f4"), "StudentName" : "Chris" }
{ "_id" : ObjectId("5e06f71825ddae1f53b621f5"), "StudentName" : null }
{ "_id" : ObjectId("5e06f71e25ddae1f53b621f6"), "StudentName" : "David" }

$cond와 $anyElementTrue로 조건 필드 구현하기

이제 집계 파이프라인의 $project 단계에서 $cond를 활용하여, StudentName 필드의 존재 여부에 따라 MyValue라는 새 필드에 1 또는 0을 할당하는 쿼리를 작성해 보겠습니다.

> db.presenceDemo.aggregate([
...    { "$project": {
...       "MyValue": {
...          "$cond": [
...             { "$anyElementTrue": [ [ "$StudentName" ] ] },
...                1,
...                0
...          ]
...       }
...    }}
... ]);

쿼리 동작 방식 설명:

  • $anyElementTrue가 StudentName 값을 배열로 감싸서 평가합니다.
  • 필드에 유효한 값(예: "Chris", "David")이 있으면 true → MyValue에 1이 할당됩니다.
  • 필드 값이 null이면 false → MyValue에 0이 할당됩니다.

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e06f70c25ddae1f53b621f3"), "MyValue" : 0 }
{ "_id" : ObjectId("5e06f71425ddae1f53b621f4"), "MyValue" : 1 }
{ "_id" : ObjectId("5e06f71825ddae1f53b621f5"), "MyValue" : 0 }
{ "_id" : ObjectId("5e06f71e25ddae1f53b621f6"), "MyValue" : 1 }

정리

이처럼 $cond와 $anyElementTrue를 조합하면 필드의 존재 여부(null 또는 빈 배열 포함)를 간단하게 판별하여 조건부 필드를 생성할 수 있습니다. 이 기법은 데이터 정제, 플래그 필드 생성, 결측치 표시 등 다양한 집계 시나리오에서 유용하게 활용됩니다.