개요
이 가이드에서는 MongoDB .NET/C# 드라이버를 사용하여 집계 작업을 수행하는 방법을 배울 수 있습니다.
집계 작업은 MongoDB 컬렉션 데이터를 처리하고 계산된 결과를 반환합니다. MongoDB Aggregation 프레임워크는 데이터 처리 파이프라인 개념을 모델로 합니다. 문서는 하나 이상의 단계로 구성된 파이프라인에 들어가고, 이 파이프라인은 문서를 집계된 결과로 변환합니다.
비유
애그리게이션 작업은 조립 라인이 있는 자동차 공장과 유사하게 작동합니다. 조립 라인에는 특정 작업을 수행하기 위한 특수 도구를 갖춘 스테이션이 있습니다. 예를 들어, 자동차를 만들 때 조립 라인은 프레임에서 시작됩니다. 그런 다음 자동차 프레임이 조립 라인을 이동할 때 각 스테이션은 별도의 부품을 조립합니다. 그 결과는 변형된 최종 제품, 즉 완성된 자동차입니다.
조립 라인은 집계 파이프라인, 개별 스테이션 은 집계 단계, 특수 도구 는 표현식 연산자, 완제품 은 집계된 결과 를 나타 냅니다 .
집계 및 찾기 연산 비교
다음 표에는 찾기 작업으로 수행할 수 있는 다양한 작업과 집계 작업으로 수행할 수 있는 작업이 나열되어 있습니다. 집계 프레임워크는 데이터를 변환하고 조작할 수 있는 확장된 기능을 제공합니다.
작업 찾기 | 집계 작업 |
|---|---|
반환할 특정 문서 선택 | 특정 문서를 선택하여 반환 |
서버 제한 사항
집계 작업을 수행할 때 다음 제한 사항을 고려합니다.
반환된 문서는 BSON 문서 크기 제한인 16메가바이트를 초과하지 않아야 합니다.
$graphLookup 단계는 100 메가바이트의 엄격한 메모리 제한을 가지며
AllowDiskUse속성을 무시합니다.
집계 예시
집계를 수행하려면 집계 단계 목록을 IMongoCollection<TDocument>.Aggregate() 메서드에 전달합니다.
참고
이 예시에서는 Atlas 샘플 데이터 세트의 sample_restaurants.restaurants 컬렉션을 사용합니다. 무료 MongoDB Atlas cluster를 생성하고 샘플 데이터 세트를 로드하는 방법에 대한 자세한 내용은 빠른 시작을 참조하세요.
다음 코드 예시는 뉴욕시의 각 자치구에 있는 빵집의 수를 계산합니다. 이를 위해 다음 단계가 포함된 집계 파이프라인을 사용합니다.
cuisine필드에"Bakery"값이 포함된 문서를 필터링하는 $match 단계입니다.일치하는 문서를
borough필드별로 그룹화하여 해당 필드의 각 고유 값에 대한 문서 수를 누적하는 $group 단계입니다.
다음 섹션에서는 예시 파이프라인에서 사용된 집계 단계를 만들고 결합하기 위해 LINQ, Builders 및 BsonDocument 접근 방식을 사용하여 이 예시를 구현합니다.
LINQ 접근 방식
// Defines a queryable collection object as a prerequisite to using LINQ var queryableCollection = collection.AsQueryable(); // Defines the query with $match and $group stages var query = queryableCollection .Where(r => r.Cuisine == "Bakery") .GroupBy(r => r.Borough) .Select(g => new { _id = g.Key, Count = g.Count() }); // Executes the query and prints the aggregated results foreach (var result in query.ToList()) { Console.WriteLine(result); }
{ _id = Bronx, Count = 71 } { _id = Brooklyn, Count = 173 } { _id = Staten Island, Count = 20 } { _id = Missing, Count = 2 } { _id = Manhattan, Count = 221 } { _id = Queens, Count = 204 }
LINQ를 사용하여 집계 파이프라인을 구성하는 방법에 대해 자세히 학습 집계 작업을 위한 LINQ 구문 가이드 참조하세요.
빌더 접근 방식
// Defines the $match aggregation stage var matchFilter = Builders<Restaurant>.Filter.Eq(r => r.Cuisine, "Bakery"); // Defines the aggregation pipeline with the $match and $group aggregation stages var pipeline = new EmptyPipelineDefinition<Restaurant>() .Match(matchFilter) .Group(r => r.Borough, g => new { _id = g.Key, Count = g.Count() } ); // Executes the aggregation pipeline var results = collection.Aggregate(pipeline).ToList(); // Prints the aggregated results foreach (var result in results) { Console.WriteLine(result); }
{ _id = Bronx, Count = 71 } { _id = Brooklyn, Count = 173 } { _id = Staten Island, Count = 20 } { _id = Missing, Count = 2 } { _id = Manhattan, Count = 221 } { _id = Queens, Count = 204 }
빌더를 사용하여 집계 파이프라인을 구성하는 방법에 대한 자세한 내용은 빌더와의 운영 가이드의 집계 파이프라인 빌드 섹션을 참조하세요.
BsonDocument 접근 방식
// Defines the $match and $group aggregation stages var matchStage = new BsonDocument { { "$match", new BsonDocument { { "cuisine", "Bakery" } } } }; var groupStage = new BsonDocument { { "$group", new BsonDocument { { "_id", "$borough" }, { "count", new BsonDocument("$sum", 1) } } } }; // Executes the aggregation pipeline var pipeline = new[] { matchStage, groupStage }; var results = collection.Aggregate<BsonDocument>(pipeline).ToList(); // Prints the aggregated results foreach (BsonDocument result in results) { Console.WriteLine(result); }
{ "_id" : "Brooklyn", "count" : 173 } { "_id" : "Manhattan", "count" : 221 } { "_id" : "Bronx", "count" : 71 } { "_id" : "Missing", "count" : 2 } { "_id" : "Staten Island", "count" : 20 } { "_id" : "Queens", "count" : 204 }
추가 정보
MongoDB Server 매뉴얼
집계 단계의 전체 목록은 MongoDB Server 매뉴얼의 집계 단계 를 참조하세요.
집계 파이프라인을 조립하는 방법을 배우고 예시를 보려면 집계 파이프라인을 참조하세요.
파이프라인 단계 생성에 대해 자세히 알아보려면 애그리게이션 단계를 참조하세요.
API 문서
이 가이드에서 설명하는 집계 작업에 대한 자세한 내용은 다음 API 문서를 참조하세요: