집계 파이프라인은 몽고DB에서 복잡한 쿼리를 실행하는 데 권장되는 방법입니다. MongoDB의 MapReduce를 사용 중이라면 보다 효율적인 계산을 위해 집계 파이프라인으로 전환하는 것이 좋습니다.

MongoDB의 집계란 무엇이며 어떻게 작동하나요?

MongoDB의 집계 파이프라인은 파이프라인이라고 하는 여러 단계를 거쳐 데이터를 전달함으로써 복잡한 쿼리를 실행할 수 있도록 하는 다각적인 절차입니다. 한 단계에서 생성된 결과는 동일한 파이프라인 내에서 후속 작업을 위한 템플릿으로 활용될 수 있습니다.

매칭 작업의 결과를 여러 단계를 거쳐 특정 순서에 따라 재배열하여 궁극적으로 원하는 결과를 도출하는 것이 한 예입니다.

집계 파이프라인 내의 각 단계에서 몽고DB 연산자가 사용되며 하나 이상의 수정된 문서를 출력으로 생성합니다. 특정 연산자가 활용되는 빈도는 검색 쿼리의 특수성에 따라 달라집니다. 경우에 따라 집계 파이프라인 과정에서 $count 또는 $sort와 같은 연산자 단계를 두 번 이상 통합해야 할 수도 있습니다.

집계 파이프라인의 단계

집계 파이프라인은 단일 쿼리에서 여러 단계를 통해 데이터를 전달합니다. 여러 단계가 있으며 자세한 내용은 MongoDB 문서 에서 확인할 수 있습니다.

물론, 여기에는 비전문가를 위해 더 쉬운 언어로 정의할 수 있는 몇 가지 기술 용어의 예가 있습니다: * **사용자 인터페이스(UI)**: 사용자가 버튼이나 메뉴와 같은 그래픽 요소를 통해 제품이나 서비스와 상호 작용하는 방식. 쉽게 말해, 웹사이트나 앱을 사용하는 것이 얼마나 쉬운지 또는 어려운지를 나타냅니다. * **사용자 경험(UX)**: 사람들이 제품이나 서비스를 사용할 때 느끼는 감정. 여기에는 탐색의 용이성, 정보의 명확성, 전반적인 만족도 등이 포함됩니다. 간단히 말해, UX는 사람들이 제품이나 서비스를 즐겁게 사용할 수 있도록 하는 것입니다. * 반응형 디자인**: 웹사이트나 앱이 스마트폰 등 다양한 기기에서 보기 좋게 보이도록 하는 디자인 접근 방식

$매치 단계

이 프로세스의 초기 단계에서는 후속 집계 단계에 포함될 데이터를 선택하기 위한 정확한 기준을 설정할 수 있습니다. 이를 통해 원하는 정보를 효율적으로 식별하고 검색할 수 있으므로 당면한 분석에 대한 간소화되고 목표에 맞는 접근 방식을 보장할 수 있습니다.

이 글도 확인해 보세요:  HTTP와 HTTPS: 차이점은 무엇인가요?

$group 단계

그룹화 단계에서는 키-값 쌍을 사용하여 사전 정의된 기준에 따라 정보를 분류하며, 각 고유한 범주는 최종 결과 내에서 고유 키로 표현됩니다.

다음과 같은 가상의 판매 데이터 인스턴스를 고려합니다:

집계 파이프라인을 활용하면 전체 판매 집계와 각 제품 카테고리 내에서 가장 많이 판매된 품목을 모두 계산할 수 있습니다:

 {
$group: {
    _id: $Section,
    total_sales_count: {$sum : $Sold},
    top_sales: {$max: $Amount},
  }
}

{{this._id}}:${{$Section}} 관계는 출력 레코드를 구성 부분에 따라 구성합니다.

$skip 단계

$skip 매개변수를 사용하면 $sum, $min, $max 또는 $avg와 같은 연산을 포함할 수 있는 집계 함수의 구현을 통해 새로운 식별자를 생성할 수 있습니다. 일반적으로 그룹화 단계 이후에 사용되며 특정 기준을 충족하지 않는 특정 레코드를 필터링할 수 있습니다. 예를 들어, 최종 결과물이 두 개 생성될 것으로 예상되지만 한 개를 폐기하려는 경우, 결과 집계에는 나머지 레코드만 포함됩니다.

집계 파이프라인에 건너뛰기 단계를 통합하려면 파이프라인 구조 내에 “$skip” 연산자를 포함시켜야 합니다.

 ...,
{
    $skip: 1
  },

$sort 단계

정보 배열을 조정하는 것은 모든 분석 프로세스의 기본적인 측면입니다. 정렬 단계를 통해 사용자는 데이터를 하향 또는 상향으로 구성할 수 있습니다. 앞서 살펴본 사례 연구에서는 어떤 부서가 가장 많은 거래량을 보이는지 파악하기 위해 제공된 수치의 크기를 줄여가며 순서를 변경할 수 있었습니다.

이전 SQL 쿼리에 정렬 순서를 포함하려면 `$sort` 매개 변수를 사용하고 정렬할 필드를 지정할 수 있습니다. 예를 들어 `name` 열을 기준으로 내림차순으로 정렬하려면 URL 끝에 `&sort=name,-1`을 추가하면 됩니다. 이렇게 하면 이름별로 정렬된 모든 레코드가 가장 최근의 것을 먼저 반환합니다. 마찬가지로 필요에 따라 다른 필드 또는 필드 조합을 지정하여 정렬할 수 있습니다.

 ...,
{
    $sort: {top_sales: -1}
  },

$limit 단계

제한 연산을 활용하면 원하는 정보의 특정 하위 집합에 집중하여 집계 파이프라인에서 생성되는 결과의 양을 효과적으로 최소화할 수 있습니다. 제한 연산자를 사용하면 집계 프로세스 내 이전 단계에서 가장 눈에 띄는 판매 수치를 얻을 수 있습니다.

 ...,
{
    $sort: {top_sales: -1}
  },

{"$limit": 1}

앞서 언급한 결과는 초기 기록만을 포함하며, 특히 이 특정 세그먼트는 체계적으로 정렬된 출력 목록 내에서 정점 위치를 차지하기 때문에 최대 수익 창출을 특징으로 합니다.

이 글도 확인해 보세요:  JavaScript를 사용하여 이미지에 X 및 Y 좌표를 오버레이하는 방법

$프로젝트 단계

$프로젝트 매개변수를 사용하면 원하는 대로 생성된 보고서를 큐레이팅할 수 있습니다. 프로젝트 함수를 사용하면 출력에 통합할 데이터 포인트를 결정하고 그에 따라 지정된 식별자를 조정할 수 있습니다.

다음은 샘플 출력에 ‘$project’ 단계가 포함되지 않은 경우의 예입니다.

파이프라인 내에 ‘$project’ 구성 요소를 통합하려면 프로젝트 구성에 포함되었을 때의 모습을 살펴봅시다.

 ...,

{
        "$project": {
            "_id": 0,
            "Section": "$_id",
            "TotalSold": "$total_sales_count",
            "TopSale": "$top_sales",

        }
    }

제품 범주에 따른 데이터의 사전 분류를 고려할 때, 앞서 언급한 접근 방식은 생성된 보고서 내의 모든 제품 섹션을 포괄합니다. 또한 총 판매 수량과 가장 많이 판매된 품목이 각각 TotalSold 및 TopSale 변수로 표시되는 출력 내에 모두 포함되도록 보장합니다.

실제로 최신 반복 작업은 이전 작업과 비교했을 때 눈에 띄게 향상된 수준의 정교함을 보여줍니다.

$언와인드 단계

제공된 주문 데이터 세트의 컨텍스트에서 `$언와인드` 단계를 활용하여 여러 주문 레코드가 포함된 배열을 개별 문서로 분리된 별개의 주문으로 분해합니다.

`$언와인드` 단계를 활용하는 것은 추가 집계 단계를 사용하기 전에 “항목” 배열을 세분화할 때 신중한 접근 방식입니다. 이 전략은 개별 제품에서 발생한 전체 수익을 계산하려는 경우에 특히 유용합니다:

 db.Orders.aggregate(
[
  {
    "$unwind": "$items"
  },
  {
    "$group": {
      "_id": "$items.product",
      "total_revenue": { "$sum": { "$multiply": ["$items.quantity", "$items.price"] } }
    }
  },
  {
    "$sort": { "total_revenue": -1 }
  },

  {
        "$project": {
            "_id": 0,
            "Product": "$_id",
            "TotalRevenue": "$total_revenue",

        }
    }
])

앞서 언급한 집계 작업으로 생성된 출력은 다음과 같습니다:

몽고DB에서 집계 파이프라인을 만드는 방법

앞서 언급한 단계는 각 단계와 관련된 기본 쿼리를 포함하여 집계 파이프라인 내에 다양한 운영 프로세스를 통합하는 방법에 대한 포괄적인 이해를 제공합니다.

다양한 관점에서 판매 데이터를 살펴보면 시스템 전체를 아우르는 집계 프로세스 내에서 몇 가지 주요 단계를 고려할 가치가 있습니다.

 db.sales.aggregate([

    {
        "$match": {
            "Sold": { "$gte": 5 }
            }
    },

        {

        "$group": {
            "_id": "$Section",
            "total_sales_count": { "$sum": "$Sold" },
            "top_sales": { "$max": "$Amount" },
            
        }

    },

    {
        "$sort": { "top_sales": -1 }
    },

    {"$skip": 0},

    {
        "$project": {
            "_id": 0,
            "Section": "$_id",
            "TotalSold": "$total_sales_count",
            "TopSale": "$top_sales",

        }
    }
    
])

자세히 살펴보니 이전 답변이 잘 알려진 문학 작품에서 발췌한 내용과 매우 유사하다는 것을 깨달았습니다. 원본 구절의 문체와 어조를 얼마나 정확하게 반영하고 있는지 정말 기이합니다.

이 글도 확인해 보세요:  파이썬을 사용하여 FLAMES 게임 플레이하기

집계 파이프라인 대 MapReduce

버전 5.0 출시와 함께 중단되기 전에는 MongoDB 내에서 데이터 집계를 수행하기 위한 기존 접근 방식은 MapReduce를 활용했습니다. MapReduce는 MongoDB 외부에서 더 광범위한 애플리케이션을 보유하고 있지만, 일반적으로 집계 파이프라인에 비해 효율성이 떨어지는 것으로 간주되어 맵과 축소 함수를 개별적으로 정의하기 위해 외부 스크립팅을 사용해야 합니다.

MongoDB 집계 파이프라인은 플랫폼 전용이지만, 복잡한 쿼리를 실행하기 위한 간소화된 접근 방식을 제공합니다. 사용 편의성과 확장 가능한 결과 외에도, 이 기능에 통합된 단계를 통해 원하는 결과를 보다 유연하게 결정할 수 있습니다.

맵리듀스에서 집계 파이프라인으로의 전환은 구현 시 점점 더 분명해지는 여러 가지 차이점을 제시합니다.

MongoDB에서 빅데이터 쿼리를 효율적으로 만들기

MongoDB에 저장된 복잡한 정보에 대한 포괄적인 계산을 효율적으로 수행하려면 쿼리를 최대한으로 최적화하는 것이 중요합니다. 다행히도 집계 파이프라인은 사용자가 여러 작업을 고성능 파이프라인으로 함께 묶을 수 있도록 함으로써 이러한 목적에 탁월한 솔루션을 제공합니다. 이렇게 하면 이러한 작업을 개별적으로 수행할 때와 같은 효율성 저하 없이 신속하게 실행할 수 있습니다.

MapReduce와 비교하여 집계 파이프라인의 효율성을 최적화하려면 관련 데이터를 색인화하는 것이 한 가지 효과적인 접근 방식입니다. 이렇게 하면 집계 프로세스의 각 단계에서 스캔해야 하는 데이터의 양을 줄여 전반적인 성능을 향상시키는 데 도움이 됩니다.

By 최은지

윈도우(Windows)와 웹 서비스에 대한 전문 지식을 갖춘 노련한 UX 디자이너인 최은지님은 효율적이고 매력적인 디지털 경험을 개발하는 데 탁월한 능력을 발휘합니다. 사용자의 입장에서 생각하며 누구나 쉽게 접근하고 즐길 수 있는 콘텐츠를 개발하는 데 주력하고 있습니다. 사용자 경험을 향상시키기 위해 연구를 거듭하는 은지님은 All Things N 팀의 핵심 구성원으로 활약하고 있습니다.