집계
개요
이 가이드에서는 Rust 드라이버에서 애그리게이션 작업을 수행하는 방법을 배울 수 있습니다.
집계 작업은 집계 파이프라인 에서 설정할 수 있는 사양에 따라 MongoDB collection의 데이터를 처리합니다. 집계 파이프라인은 하나 이상의 단계 로 구성됩니다. 각 단계는 해당 표현식 연산자를 기반으로 작업을 수행합니다. 드라이버가 집계 파이프라인을 실행한 후 집계된 결과를 반환합니다.
이 가이드에는 다음 섹션이 포함되어 있습니다.
애그리게이션 비교 및 찾기 작업에서는 애그리게이션과 찾기 작업 간의 기능 차이점에 대해 설명합니다.
MongoDB 서버 제한 사항 은 애그리게이션 작업에 대한 메모리 사용량에 대한 서버 제한 사항을 설명합니다.
예제 에서는 다양한 사용 사례에 대한 애그리게이션 예제를 제공합니다.
추가 정보에서 이 가이드에 언급된 유형 및 메소드에 대한 리소스 및 API 문서 링크를 찾을 수 있습니다.
비유
애그리게이션 작업은 조립 라인이 있는 자동차 공장과 유사하게 작동합니다. 조립 라인에는 특정 작업을 수행하기 위한 특수 도구를 갖춘 스테이션이 있습니다. 예를 들어, 자동차를 만들 때 조립 라인은 프레임에서 시작됩니다. 그런 다음 자동차 프레임이 조립 라인을 이동할 때 각 스테이션은 별도의 부품을 조립합니다. 그 결과는 변형된 최종 제품, 즉 완성된 자동차입니다.
조립 라인은 집계 파이프라인, 개별 스테이션 은 집계 단계, 특수 도구 는 표현식 연산자, 완제품 은 집계된 결과 를 나타 냅니다 .
집계 및 찾기 연산 비교
다음 표에는 찾기 작업으로 수행할 수 있는 다양한 작업과 집계 작업으로 수행할 수 있는 작업이 나열되어 있습니다. 집계 프레임워크는 데이터를 변환하고 조작할 수 있는 확장된 기능을 제공합니다.
작업 찾기 | 집계 작업 |
---|---|
Select certain documents to return Select which fields to return Sort the results Limit the results Count the results | Select certain documents to return Select which fields to return Sort the results Limit the results Count the results Rename fields Compute new fields Summarize data Connect and merge data sets |
서버 제한 사항
애그리게이션 작업을 수행할 때 다음과 같은 제한 사항을 고려하세요.
반환된 문서는 BSON 문서 크기 제한인 16메가바이트를 초과하지 않아야 합니다.
파이프라인 100 단계의 메모리 제한은 기본값 메가바이트입니다. 필요한 경우 allow_disk_use 를 설정하여 이 제한을 초과할 수 있습니다.
AggregateOptions
의 필드 입니다.$graphLookup 연산자 는 100 메가바이트의 엄격한 메모리 제한이 있으며
allow_disk_use
설정을 무시합니다.
예시
이 섹션의 예제에서는 다음 샘플 문서를 사용합니다. 각 문서는 서평 웹사이트의 사용자 프로필을 나타내며, 이름, 연령, 관심사 장르, 웹사이트에서 마지막으로 활동한 날짜에 대한 정보를 포함합니다.
{ "name": "Sonya Mehta", "age": 23, "genre_interests": ["fiction", "mystery", "memoir"], "last_active": { "$date": "2023-05-13T00:00:00.000Z" } }, { "name": "Selena Sun", "age": 45, "genre_interests": ["fiction", "literary", "theory"], "last_active": { "$date": "2023-05-25T00:00:00.000Z" } }, { "name": "Carter Johnson", "age": 56, "genre_interests": ["literary", "self help"], "last_active": { "$date": "2023-05-31T00:00:00.000Z" } }, { "name": "Rick Cortes", "age": 18, "genre_interests": ["sci-fi", "fantasy", "memoir"], "last_active": { "$date": "2023-07-01T00:00:00.000Z" } }, { "name": "Belinda James", "age": 76, "genre_interests": ["literary", "nonfiction"], "last_active": { "$date": "2023-06-11T00:00:00.000Z" } }, { "name": "Corey Saltz", "age": 29, "genre_interests": ["fiction", "sports", "memoir"], "last_active": { "$date": "2023-01-23T00:00:00.000Z" } }, { "name": "John Soo", "age": 16, "genre_interests": ["fiction", "sports"], "last_active": { "$date": "2023-01-03T00:00:00.000Z" } }, { "name": "Lisa Ray", "age": 39, "genre_interests": ["poetry", "art", "memoir"], "last_active": { "$date": "2023-05-30T00:00:00.000Z" } }, { "name": "Kiran Murray", "age": 20, "genre_interests": ["mystery", "fantasy", "memoir"], "last_active": { "$date": "2023-01-30T00:00:00.000Z" } }, { "name": "Beth Carson", "age": 31, "genre_interests": ["mystery", "nonfiction"], "last_active": { "$date": "2023-08-04T00:00:00.000Z" } }, { "name": "Thalia Dorn", "age": 21, "genre_interests": ["theory", "literary", "fiction"], "last_active": { "$date": "2023-08-19T00:00:00.000Z" } }, { "name": "Arthur Ray", "age": 66, "genre_interests": ["sci-fi", "fantasy", "fiction"], "last_active": { "$date": "2023-11-27T00:00:00.000Z" } }
장르별 연령 인사이트
다음은 각 장르에 관심이 있는 사용자의 평균, 최소, 최대 연령을 계산하는 예시입니다.
집계 파이프라인에는 다음 단계가 포함됩니다:
genre_interests
필드의 각 배열 항목을 새 문서로 분리하는$unwind
단계.genre_interests
필드 값을 기준으로 문서를 그룹화하는$group
단계입니다. 이 단계에서는$avg
,$min
및$max
연산자를 사용하여 평균, 최소, 최대 사용자 연령을 찾습니다.
let age_pipeline = vec![ doc! { "$unwind": doc! { "path": "$genre_interests" } }, doc! { "$group": doc! { "_id": "$genre_interests", "avg_age": doc! { "$avg": "$age" }, "min_age": doc! { "$min": "$age" }, "max_age": doc! { "$max": "$age" } } } ]; let mut results = my_coll.aggregate(age_pipeline).await?; while let Some(result) = results.try_next().await? { println!("* {:?}", result); }
* { "_id": "memoir", "avg_age": 25.8, "min_age": 18, "max_age": 39 } * { "_id": "sci-fi", "avg_age": 42, "min_age": 18, "max_age": 66 } * { "_id": "fiction", "avg_age": 33.333333333333336, "min_age": 16, "max_age": 66 } * { "_id": "nonfiction", "avg_age": 53.5, "min_age": 31, "max_age": 76 } * { "_id": "self help", "avg_age": 56, "min_age": 56, "max_age": 56 } * { "_id": "poetry", "avg_age": 39, "min_age": 39, "max_age": 39 } * { "_id": "literary", "avg_age": 49.5, "min_age": 21, "max_age": 76 } * { "_id": "fantasy", "avg_age": 34.666666666666664, "min_age": 18, "max_age": 66 } * { "_id": "mystery", "avg_age": 24.666666666666668, "min_age": 20, "max_age": 31 } * { "_id": "theory", "avg_age": 33, "min_age": 21, "max_age": 45 } * { "_id": "art", "avg_age": 39, "min_age": 39, "max_age": 39 } * { "_id": "sports", "avg_age": 22.5, "min_age": 16, "max_age": 29 }
시간 구성 요소별로 그룹화
다음 예에서는 매월 마지막으로 활성화된 사용자 수를 찾습니다.
집계 파이프라인에는 다음 단계가 포함됩니다:
$project
last_active
필드 에서 월을 숫자로month_last_active
필드 로 추출하는 단계$group
month_last_active
필드 를 기준으로 문서를 그룹 하고 월별 문서 수를 계산하는 단계$sort
월에 오름차순 정렬을 설정하다 하는 단계
let last_active_pipeline = vec![ doc! { "$project": { "month_last_active" : doc! { "$month" : "$last_active" } } }, doc! { "$group": doc! { "_id" : doc! {"month_last_active": "$month_last_active"} , "number" : doc! { "$sum" : 1 } } }, doc! { "$sort": { "_id.month_last_active" : 1 } } ]; let mut results = my_coll.aggregate(last_active_pipeline).await?; while let Some(result) = results.try_next().await? { println!("* {:?}", result); }
* { "_id": { "month_last_active": 1 }, "number": 3 } * { "_id": { "month_last_active": 5 }, "number": 4 } * { "_id": { "month_last_active": 6 }, "number": 1 } * { "_id": { "month_last_active": 7 }, "number": 1 } * { "_id": { "month_last_active": 8 }, "number": 2 } * { "_id": { "month_last_active": 11 }, "number": 1 }
인기 장르 계산
다음 예에서는 사용자의 관심사에 표시되는 빈도를 기준으로 가장 인기 있는 세 가지 장르를 찾습니다.
집계 파이프라인에는 다음 단계가 포함됩니다:
$unwind
genre_interests
필드 의 각 배열 항목을 새 문서 로 분리하는 단계$group
genre_interests
필드 를 기준으로 문서를 그룹 하고 장르별 문서 수를 계산하는 단계$sort
단계를 사용하여 장르 인기도에 내림차순 정렬을 설정하다 합니다.$limit
처음 세 장르만 표시하는 단계
let popularity_pipeline = vec![ doc! { "$unwind" : "$genre_interests" }, doc! { "$group" : doc! { "_id" : "$genre_interests" , "number" : doc! { "$sum" : 1 } } }, doc! { "$sort" : doc! { "number" : -1 } }, doc! { "$limit": 3 } ]; let mut results = my_coll.aggregate(popularity_pipeline).await?; while let Some(result) = results.try_next().await? { println!("* {:?}", result); }
* { "_id": "fiction", "number": 6 } * { "_id": "memoir", "number": 5 } * { "_id": "literary", "number": 4 }
추가 정보
이 가이드에 언급된 개념에 대해 자세히 알아보려면 다음 서버 매뉴얼 항목을 참조하세요.
aggregate()
메서드의 동작에 학습 보려면 데이터 조회 가이드 의 애그리게이션 작업 섹션을 참조하세요.
집계 파이프라인 내에서 결과를 정렬하는 방법에 학습 보려면 결과 정렬 가이드 를 참조하세요.
API 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.