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

MongoDB 집계에서 NULL 값을 무시하고 첫 번째 값 가져오기: 조건부 $first 활용법

MongoDB에서 집계(aggregation)를 수행할 때 NULL 값은 제외하고 각 그룹의 첫 번째 레코드를 가져오고 싶은 경우가 있습니다. 이럴 때는 aggregate() 파이프라인 안에서 $match 연산자를 활용하면 됩니다. 핵심 아이디어는 간단합니다. 먼저 $match로 NULL이 아닌 문서만 필터링한 후, $group$first를 조합해 원하는 첫 번째 값을 추출하는 것입니다.

1. 샘플 컬렉션 생성하기

먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다. 일부 문서의 StudentSubject 필드에는 의도적으로 NULL을 넣었습니다.

> db.conditionalFirstDemo.insertOne({_id:100,"StudentName":"Chris","StudentSubject":null});
{ "acknowledged" : true, "insertedId" : 100 }
> db.conditionalFirstDemo.insertOne({_id:101,"StudentName":"Chris","StudentSubject":null});
{ "acknowledged" : true, "insertedId" : 101 }
> db.conditionalFirstDemo.insertOne({_id:102,"StudentName":"Chris","StudentSubject":"MongoDB"});
{ "acknowledged" : true, "insertedId" : 102 }
> db.conditionalFirstDemo.insertOne({_id:103,"StudentName":"Chris","StudentSubject":"MongoDB"});
{ "acknowledged" : true, "insertedId" : 103 }
> db.conditionalFirstDemo.insertOne({_id:104,"StudentName":"Chris","StudentSubject":null});
{ "acknowledged" : true, "insertedId" : 104 }

2. 전체 문서 확인하기

find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.

> db.conditionalFirstDemo.find();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : 100, "StudentName" : "Chris", "StudentSubject" : null }
{ "_id" : 101, "StudentName" : "Chris", "StudentSubject" : null }
{ "_id" : 102, "StudentName" : "Chris", "StudentSubject" : "MongoDB" }
{ "_id" : 103, "StudentName" : "Chris", "StudentSubject" : "MongoDB" }
{ "_id" : 104, "StudentName" : "Chris", "StudentSubject" : null }

3. 조건부 $first 집계 쿼리 작성하기

이제 본격적으로 NULL을 무시하는 조건부 $first 집계 쿼리를 살펴보겠습니다. 파이프라인은 두 단계로 구성됩니다.

  • $match 단계: { "$ne": null } 조건으로 StudentSubject 필드가 NULL인 문서를 제외합니다.
  • $group 단계: StudentName 기준으로 그룹화한 뒤, $first로 해당 그룹의 첫 번째 과목 값을 가져옵니다.
> db.conditionalFirstDemo.aggregate([
   { "$match": { "StudentSubject": { "$ne": null } } },
   { "$group": {
       "_id": "$StudentName",
       "StudentSubject": { "$first": "$StudentSubject" }
   }}
]);

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

{ "_id" : "Chris", "StudentSubject" : "MongoDB" }

결과 분석

출력 결과를 보면 _id: 100101처럼 StudentSubject가 NULL인 문서들은 $match 단계에서 걸러졌기 때문에, $first가 참조하는 첫 번째 값은 자연스럽게 "MongoDB"가 됩니다. 만약 $match 없이 바로 $group$first만 사용했다면, 가장 앞에 있는 NULL 값이 그대로 반환되어 원하는 결과를 얻지 못했을 것입니다.

정리하면, MongoDB 집계에서 NULL을 건너뛰고 유효한 첫 번째 값을 얻으려면 $match로 사전 필터링 → $group으로 그룹화 → $first로 값 추출의 순서로 파이프라인을 구성하는 것이 가장 확실한 방법입니다.