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

MongoDB 집계(Aggregation)를 활용해 배열의 값만 추출하는 방법

MongoDB에서 배열에 담긴 문서들 중 필드의 값(value)만 깔끔하게 추출하고 싶다면, 집계 파이프라인(aggregation pipeline)의 $project$map 연산자를 조합하면 됩니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 데모용 컬렉션을 만들고 문서를 삽입합니다. Information 배열 안에 두 개의 하위 문서가 들어 있는 구조입니다.

> db.demo411.insertOne(
...     {
...        "Information" : [
...           {
...              "Name1" : "Chris",
...              "Name2" : "David"
...           },
...           {
...              "Name1" : "John",
...              "Name2" : "John"
...           }
...        ]
...     }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e70f19715dc524f70227682")
}

2. find() 메서드로 전체 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.

> db.demo411.find();

위 쿼리는 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5e70f19715dc524f70227682"), "Information" : [ { "Name1" : "Chris", "Name2" : "David" }, { "Name1" : "John", "Name2" : "John" } ] }

현재 상태에서는 필드명(Name1, Name2)까지 함께 출력됩니다. 여기서 값만 별도의 배열로 뽑아내 보겠습니다.

3. $project와 $map으로 값만 추출하는 쿼리

배열 내부의 값만 가져오려면 아래와 같이 aggregate()를 사용합니다. 핵심은 다음 두 가지입니다.

  • _id : 0 — 결과에서 _id 필드를 제외합니다.
  • $mapInformation 배열을 순회하면서 각 요소를 $$out.Name1$$out.Name2 값만 담은 새 배열로 변환합니다.
> db.demo411.aggregate(
...     [
...        {$project : {
...            _id : 0,
...            Information : {$map : {input : "$Information", as : "out", in : ["$$out.Name1", "$$out.Name2"]}}
...            }
...        }
...     ]
... )

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

{ "Information" : [ [ "Chris", "David" ], [ "John", "John" ] ] }

정리

$map 연산자는 입력 배열의 각 요소에 지정한 표현식을 적용해 새로운 배열을 반환합니다. 위 예제처럼 in 절에 원하는 필드 값만 나열하면, 필드명 없이 순수한 값들로 구성된 배열을 손쉽게 얻을 수 있습니다. 이 방식은 API 응답을 가공하거나 데이터 후처리를 단순화할 때 특히 유용합니다.