Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

$ 그룹 (집계 단계)

$group

$group 스테이지는 그룹 키에 따라 동일한 필드, 필드들 또는 표현식을 가진 여러 문서를 단일 문서로 결합합니다. 결과는 고유한 그룹 키당 하나의 문서입니다.

그룹 키는 대부분 필드이거나 필드 그룹입니다. 그룹 키는 표현식의 결과일 수도 있습니다. 그룹 키는 $group 파이프라인 단계의 _id 필드를 사용해 설정할 수 있습니다. 사용 예시는 아래를 참조하세요.

$group 단계 출력에서 _id 필드는 해당 문서의 그룹 키로 설정됩니다.

출력 문서에는 축적자 표현식을 사용하여 설정한 추가 필드도 포함될 수 있습니다.

참고

$group은 출력 문서의 순서를 지정하지 않습니다.

다음 환경에서 호스팅되는 배포에 $group 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

  • MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전

  • MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전

$group 단계의 프로토타입 형식은 다음과 같습니다.

{
$group:
{
_id: <expression>, // Group key
<field1>: { <accumulator1> : <expression1> },
...
}
}
필드
설명

_id

필수입니다. _id 표현식 그룹 키를 지정합니다. _id null 값 또는 기타 상수 값을 지정하는 경우 $group 단계는 모든 입력 문서의 값을 집계하는 단일 문서 반환합니다. Null로 그룹화 예시 참조하세요.

field

_id축적자 연산자 는 유효한 모든 expression 을 사용할 수 있습니다. 표현식에 대한 자세한 내용은 표현식을 참조하세요 .

$group 데이터를 처리하기 전에 파이프라인이 블로킹 단계에서 모든 입력 데이터가 조회될 때까지 대기하도록 하는 블로킹 단계입니다. 블로킹 단계는 여러 단계가 있는 파이프라인에 대한 병렬 처리를 줄이기 때문에 성능을 저하시킬 수 있습니다. 블로킹 단계는 대규모 데이터 세트에 대해 상당한 양의 메모리를 사용할 수도 있습니다.

<accumulator> 연산자는 다음 누산기 연산자 중 하나이어야 합니다.

이름
설명

사용자 정의 누산기 함수의 결과를 반환합니다.

각 그룹에 대한 고유한 표현식 값의 배열을 반환합니다. 배열 요소의 순서가 정의되지 않았습니다.

버전 5.0에서 변경: $setWindowFields 단계에서 사용할 수 있습니다.

숫자 값의 평균을 반환합니다. 숫자가 아닌 값을 무시합니다.

버전 5.0에서 변경: $setWindowFields 단계에서 사용할 수 있습니다.

지정된 정렬 순서에 따라 그룹 내 하위 요소를 반환합니다.

버전 5.2에 추가되었습니다.

2} 및 단계에서 $group $setWindowFields 사용할 수 있습니다.

지정된 정렬 순서에 따라 그룹 내 하위 개 요소의 집계를 반환합니다.n

버전 5.2에 추가되었습니다.

2} 및 단계에서 $group $setWindowFields 사용할 수 있습니다.

둘 이상의 배열의 요소를 결합한 단일 배열 반환합니다.

버전 8.1에 추가 되었습니다.

그룹에 있는 문서 수를 반환합니다.

$count 파이프라인 스테이지와는 다릅니다.

버전 5.2의 새로운 기능: $group$setWindowFields 단계에서 사용할 수 있습니다.

그룹의 첫 번째 문서에 대한 표현식 결과를 반환합니다.

버전 5.0에서 변경: $setWindowFields 단계에서 사용할 수 있습니다.

그룹 내 첫 n 개 요소의 집계를 반환합니다. 문서가 정해진 순서로 정리되어 있을 때만 의미가 있습니다. $firstN 배열 연산자와 다릅니다.

버전 5.2의 새로운 기능: $group, 표현식, $setWindowFields 단계에서 사용할 수 있습니다.

그룹의 마지막 문서에 대한 표현식의 결과를 반환합니다.

버전 5.0에서 변경: $setWindowFields 단계에서 사용할 수 있습니다.

그룹 내 마지막 n 개 요소의 집계를 반환합니다. 문서가 정해진 순서로 정리되어 있을 때만 의미가 있습니다. $lastN 배열 연산자와 다릅니다.

버전 5.2의 새로운 기능: $group, 표현식, $setWindowFields 단계에서 사용할 수 있습니다.

각 그룹에 대해 가장 높은 표현식 값을 반환합니다.

버전 5.0에서 변경: $setWindowFields 단계에서 사용할 수 있습니다.

그룹 내 최댓값을 가진 개 요소의 집계를 반환합니다.n $maxN 배열 연산자와는 다릅니다.

버전 5.2에 추가되었습니다.

$group, $setWindowFields표현식으로 사용할 수 있습니다.

중앙값, 즉 50번째 백분위수의 근사치를 스칼라 값으로 반환합니다.

버전 7.0에 추가.

이 연산자는 이 단계에서 누산기로 사용할 수 있습니다:

집계 표현식으로도 사용할 수 있습니다.

각 그룹에 대한 입력 문서를 결합하여 생성된 문서를 반환합니다.

각 그룹에 대해 가장 낮은 표현식 값을 반환합니다.

버전 5.0에서 변경: $setWindowFields 단계에서 사용할 수 있습니다.

그룹 내 최솟값을 가진 개 요소의 집계를 반환합니다.n $minN 배열 연산자와 다릅니다.

버전 5.2에 추가되었습니다.

$group, $setWindowFields표현식으로 사용할 수 있습니다.

지정된 백분위수 값에 해당하는 스칼라 값의 배열을 반환합니다.

버전 7.0에 추가.

이 연산자는 이 단계에서 누산기로 사용할 수 있습니다:

집계 표현식으로도 사용할 수 있습니다.

각 그룹의 문서에 대한 표현식 값의 배열을 반환합니다.

버전 5.0에서 변경: $setWindowFields 단계에서 사용할 수 있습니다.

배열을 2개 이상 가져온 다음 어떤 입력 배열에도 표시되는 요소가 포함된 배열을 1개 반환합니다.

버전 8.1에 추가 되었습니다.

입력 값의 모집단 표준 편차를 반환합니다.

버전 5.0에서 변경: $setWindowFields 단계에서 사용할 수 있습니다.

입력 값의 표본 표준 편차를 반환합니다.

버전 5.0에서 변경: $setWindowFields 단계에서 사용할 수 있습니다.

숫자 값의 합계를 반환합니다. 숫자가 아닌 값을 무시합니다.

버전 5.0에서 변경: $setWindowFields 단계에서 사용할 수 있습니다.

지정된 정렬 순서에 따라 그룹 내 최상위 요소를 반환합니다.

버전 5.2에 추가되었습니다.

2} 및 단계에서 $group $setWindowFields 사용할 수 있습니다.

지정된 정렬 순서에 따라 그룹 내 상위 개 요소의 집계를 반환합니다.n

버전 5.2에 추가되었습니다.

2} 및 단계에서 $group $setWindowFields 사용할 수 있습니다.

$group 단계가 100MB의 RAM을 초과하면 MongoDB는 임시 파일에 데이터를 씁니다. 그러나 allowDiskUse 옵션이 false로 설정되어 있으면 $group은 오류를 반환합니다. 자세한 내용은 집계 파이프라인 제한을 참조하세요.

이 섹션에서는 $group의 성능을 개선하기 위한 최적화에 대해 설명합니다. 수동으로 수행할 수 있는 최적화와 MongoDB가 내부적으로 수행할 수 있는 최적화가 있습니다.

파이프라인이 동일한 필드를 기준으로 sorts(정렬) 및 groups(그룹화)를 수행하고, $group 단계에서 $first 또는 $last 누산기 연산자만 사용하는 경우 정렬 순서와 일치하는 그룹화된 필드에 인덱스 를 추가하는 것이 좋습니다. 어떤 경우에는 $group 단계에서 인덱스를 사용하여 각 그룹의 첫 번째 또는 마지막 문서를 빠르게 찾을 수 있습니다.

예시

movies 컬렉션 { year: 1, title: 1 } 인덱스 포함된 경우 다음 파이프라인 해당 인덱스 사용하여 각 그룹 의 첫 번째 문서 찾을 수 있습니다.

db.movies.aggregate([
{
$sort: { year: 1, title: 1 }
},
{
$group: {
_id: { year: "$year" },
title: { $first: "$title" }
}
}
])

버전 5.2부터는 다음 중 하나에 해당하는 경우 MongoDB가 슬롯 기반 실행 쿼리 엔진을 사용해 $group 단계를 실행합니다.

  • $group 파이프라인의 첫 번째 단계입니다.

  • 파이프라인의 모든 이전 단계는 슬롯 기반 실행 엔진에 의해 실행될 수도 있습니다.

자세한 내용은 $group 최적화를 참조하세요.

이 페이지의 예제에서는 sample_mflix 샘플 데이터 세트 의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB deployment 에 로드하는 방법에 대한 자세한 내용은 샘플 데이터 세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우 이 페이지의 예제를 실행 하려면 데이터베이스를 삭제하고 다시 만들어야 할 수 있습니다.

다음 집계 작업은 $group 단계를 사용하여 movies 컬렉션의 문서 수를 계산합니다.

db.movies.aggregate([
{
$group: {
_id: null,
count: { $count: {} }
}
}
])
[
{
_id: null,
count: 21349
}
]

이 집계 작업은 다음 SQL 문과 동일합니다.

SELECT COUNT(*) AS count FROM movies

다음 집계 작업은 단계를 $group rated movies 사용하여 컬렉션 에서 고유한 값을 조회 .

db.movies.aggregate( [ { $group : { _id : "$rated" } } ] )
[
{
_id: 'TV-PG'
},
{
_id: 'PG'
},
{
_id: 'TV-14'
},
{
_id: 'OPEN'
},
{
_id: 'Not Rated'
},
{
_id: 'GP'
},
{
_id: 'TV-Y7'
},
{
_id: 'G'
},
{
_id: 'PG-13'
},
{
_id: null
},
{
_id: 'M'
},
{
_id: 'R'
},
{
_id: 'TV-MA'
},
{
_id: 'APPROVED'
},
{
_id: 'PASSED'
},
{
_id: 'Approved'
},
{
_id: 'AO'
},
{
_id: 'TV-G'
}
]

참고

예시 들어, 다음 형식의 $group 연산은 DISTINCT_SCAN이(가) 발생할 수 있습니다.

{ $group : { _id : "$<field>" } }

고유 값을 검색하기 위한 동작에 대한 자세한 내용은 고유 명령 동작을 참조하세요.

작업 결과가 인지 DISTINCT_SCAN 확인하려면작업의 설명 결과를 확인하세요.

다음 집계 게이션 작업은 rated 필드 기준으로 문서를 그룹화하여 등급별 총 런타임을 계산하고 총 런타임이 100000 이상인 등급만 반환합니다.

db.movies.aggregate(
[
// First Stage
{
$group: {
_id: "$rated",
totalRuntime: { $sum: "$runtime" }
}
},
// Second Stage
{
$match: { "totalRuntime": { $gte: 100000 } }
}
]
)
[
{
_id: 'PG-13',
totalRuntime: 250843
},
{
_id: 'R',
totalRuntime: 582318
},
{
_id: null,
totalRuntime: 967127
},
{
_id: 'PG',
totalRuntime: 191204
}
]
첫 번째 단계:
단계에서는 로 $group 문서를 rated 그룹화하여 고유한 등급 값을 조회 합니다. 이 단계에서는 각 totalRuntime 평가 그룹 에 대해 를 반환합니다.
두 번째 단계:
단계는 결과 문서를 필터링하여 가 이상인 $match 등급만 totalRuntime 100000반환합니다.

이 집계 작업은 다음 SQL 문과 동일합니다.

SELECT rated,
Sum(runtime) AS totalRuntime
FROM movies
GROUP BY rated
HAVING totalRuntime >= 100000

다음 파이프라인 1910 이전 연도의 총 런타임, 평균 런타임 및 영화 수를 계산합니다.

db.movies.aggregate([
{ $match: { "year": { $lt: 1910 } } },
{
$group: {
_id: "$year",
totalRuntime: { $sum: "$runtime" },
averageRuntime: { $avg: "$runtime" },
count: { $sum: 1 }
}
},
{ $sort: { totalRuntime: -1 } }
])
[
{ _id: 1909, totalRuntime: 14, averageRuntime: 14, count: 1 },
{ _id: 1903, totalRuntime: 11, averageRuntime: 11, count: 1 },
{ _id: 1896, totalRuntime: 2, averageRuntime: 1, count: 2 }
]
첫 번째 단계:
$match 단계는 이전에 개봉한 영화만 1910 다음 단계로 전달하도록 문서를 필터링합니다.
두 번째 단계:
단계에서는 문서를 연도별로 그룹화하고 각 그룹 에 있는 문서의 총 런타임, 평균 런타임 및 총 개수를 $group 계산합니다.
세 번째 단계:
$sort 단계는 각 그룹 의 총 런타임을 기준으로 결과를 내림차순으로 정렬합니다.

이 집계 작업은 다음 SQL 문과 동일합니다.

SELECT year,
Sum(runtime) AS totalRuntime,
Avg(runtime) AS averageRuntime,
Count(*) AS count
FROM movies
WHERE year < 1910
GROUP BY year
ORDER BY totalRuntime DESC

다음 집계 작업은 null_id 그룹 지정하여 컬렉션 에 있는 모든 문서의 총 런타임, 평균 런타임 및 개수를 계산합니다.

db.movies.aggregate([
{
$group: {
_id: null,
totalRuntime: { $sum: "$runtime" },
averageRuntime: { $avg: "$runtime" },
count: { $sum: 1 }
}
}
])
[
{
_id: null,
totalRuntime: 2167458,
averageRuntime: 103.65652797704448,
count: 21349
}
]

이 집계 작업은 다음 SQL 문과 동일합니다.

SELECT Sum(runtime) AS totalRuntime,
Avg(runtime) AS averageRuntime,
Count(*) AS count
FROM movies

다음 집계 작업은 movies 컬렉션 의 데이터를 피벗하여 연도별로 제목을 그룹 합니다.

db.movies.aggregate([
{ $match: { year: { $lt: 1910 } } },
{ $group: { _id: "$year", titles: { $push: "$title" } } },
{ $sort: { _id: 1 } }
])
[
{ _id: 1896, titles: [ 'The Kiss', 'The Kiss' ] },
{ _id: 1903, titles: [ 'The Great Train Robbery' ] },
{ _id: 1909, titles: [ 'A Corner in Wheat' ] }
]

다음 집계 작업은 문서를 연도별로 그룹화합니다.

db.movies.aggregate([
{ $match: { year: { $lt: 1910 } } },
{ $group: { _id: "$year", movies: { $push: "$$ROOT" } } },
{
$addFields: {
totalRuntime: { $sum: "$movies.runtime" }
}
},
{ $sort: { _id: 1 } }
])
[
{ _id: 1896, movies: '...', totalRuntime: 2 },
{ _id: 1903, movies: '...', totalRuntime: 11 },
{ _id: 1909, movies: '...', totalRuntime: 14 }
]
첫 번째 단계:
$match 1910 이전에 개봉한 영화만 다음 단계로 전달하도록 문서를 필터링합니다.
두 번째 단계:
$group$$ROOT 시스템 변수를 사용하여 전체 문서를 연도별로 그룹 합니다.
세 번째 단계:

$addFields 각 연도의 총 영화 상영 시간을 포함하는 필드 출력에 추가합니다.

참고

결과 문서는 BSON 문서 크기 제한인 16메비바이트를 초과할 수 없습니다.

네 번째 단계:
$sort 는 결과 문서를 _id 기준으로 오름차순으로 정렬합니다.

이 페이지의 C# 예제에서는 Atlas 샘플 데이터 세트sample_mflix 데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB .NET/ C# 드라이버 문서에서 시작하기 를 참조하세요.

다음 Movie 클래스는 sample_mflix.movies 컬렉션의 문서를 모델링합니다.

public class Movie
{
public ObjectId Id { get; set; }
public int Runtime { get; set; }
public string Title { get; set; }
public string Rated { get; set; }
public List<string> Genres { get; set; }
public string Plot { get; set; }
public ImdbData Imdb { get; set; }
public int Year { get; set; }
public int Index { get; set; }
public string[] Comments { get; set; }
[BsonElement("lastupdated")]
public DateTime LastUpdated { get; set; }
}

참고

Pascal Case를 위한 ConventionPack

이 페이지의 C# 클래스는 속성 이름에 파스칼 표기법을 사용하지만, MongoDB 컬렉션의 필드 이름은 카멜 표기법을 사용합니다. 이 차이를 해결하기 위해 애플리케이션이 시작될 때 다음 코드를 사용하여 ConventionPack을 등록할 수 있습니다.

var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);

MongoDB .NET/ C# 운전자 사용하여 $group 집계 파이프라인 에 단계를 추가하려면 PipelineDefinition 객체 에서 Group() 메서드를 호출합니다.

다음 예시 Rated 필드 값을 기준으로 문서를 그룹화하는 파이프라인 단계를 만듭니다. 각 그룹의 평점은 각 출력 문서 의 Rating 필드 에 표시됩니다. 각 출력 문서 에는 각 그룹 의 영화에 대한 총, 중앙값 및 90번째 백분위 런타임 값을 저장 TotalRuntime, MedianRuntime, NinetiethPercentileRuntime라는 이름의 필드도 포함되어 있습니다.

var pipeline = new EmptyPipelineDefinition<Movie>()
.Group(
id: m => m.Rated,
group: g => new
{
Rating = g.Key,
TotalRuntime = g.Sum(m => m.Runtime),
MedianRuntime = g.Select(m => m.Runtime).Median(),
NinetiethPercentileRuntime = g.Select(m => m.Runtime).Percentile(new[] { 0.9 })
}
);

이 페이지의 Node.js 예제에서는 Atlas 샘플 데이터 세트sample_mflix 데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB Node.js 운전자 설명서에서 시작하기 를 참조하세요.

MongoDB Node.js 운전자 사용하여 집계 파이프라인 에 $group 단계를 추가하려면 파이프라인 객체 에서 $group 연산자 사용합니다.

다음 예시 rated 필드 값을 기준으로 문서를 그룹화하는 파이프라인 단계를 만듭니다. 각 출력 문서 에는 각 그룹의 평점을 저장하는 rating 필드 포함되어 있습니다. 각 출력 문서 에는 그룹 에 있는 모든 영화의 총 런타임을 저장하는 totalRuntime 필드 도 포함되어 있습니다. 그런 다음 이 예시 에서는 집계 파이프라인 실행합니다.

const pipeline = [
{
$group: {
_id: "$rated",
rating: { $first: "$rated" },
totalRuntime: { $sum: "$runtime" }
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

그룹 및 총 데이터 튜토리얼에서는 일반적인 사용 사례에서 $group 연산자에 대한 광범위한 예시를 제공합니다.

관련 파이프라인 단계에 대해 자세히 학습 $addFields 가이드 참조하세요.

돌아가기

$graphLookup

스킬 배지 획득

무료로 '데이터 변환의 기초'를 마스터하세요!

자세한 내용을 알아보세요.

이 페이지의 내용