정의
$bucketAuto
지정된 표현식을 기반으로 수신 문서를 버킷이라는 특정 수의 그룹으로 분류합니다. 버킷 경계는 지정된 수의 버킷에 문서를 고르게 분산할 수 있도록 자동으로 결정됩니다.
각 버킷은 출력에서 문서로 표시됩니다. 각 버킷에 대한 문서에는 다음이 포함됩니다.
버킷의 경계를 지정하는
_id
객체입니다._id.min
필드는 버킷의 포괄 하한을 지정합니다._id.max
필드는 버킷의 상한을 지정합니다. 이 경계는 포함되는 시리즈의 마지막 버킷을 제외한 모든 버킷에 대해 배타적입니다.
버킷의 문서 수가 포함된
count
필드입니다.output
문서가 지정되지 않은 경우count
필드가 기본적으로 포함됩니다.
$bucketAuto
단계의 형식은 다음과 같습니다.{ $bucketAuto: { groupBy: <expression>, buckets: <number>, output: { <output1>: { <$accumulator expression> }, ... } granularity: <string> } } 필드유형설명groupBy
표현식
buckets
integer
입력 문서가 그룹화되는 버킷 수를 지정하는 양의 32비트 정수입니다.
output
문서
선택 사항
_id
필드 외에 출력 문서에 포함할 필드를 지정하는 문서입니다. 포함할 필드를 지정하려면 축적자 표현식을 사용해야 합니다.<outputfield1>: { <accumulator>: <expression1> }, ... output
을 지정하면 기본count
필드가 출력 문서에 포함되지 않습니다.count
표현식을output
문서의 일부로 명시적으로 지정하여 포함시킵니다.output: { <outputfield1>: { <accumulator>: <expression1> }, ... count: { $sum: 1 } } granularity
문자열
선택 사항. 기본 숫자 시리즈 를 지정하는 계산된 경계 가장자리가 기본 반올림 숫자 또는 의 거듭제곱으로 끝나도록 하는 데 string 10 사용합니다.
모든
groupBy
값이 숫자이고NaN
이(가) 아닌 경우에만 사용할 수 있습니다.지원되는
granularity
값은 다음과 같습니다."R5"
"R10"
"R20"
"R40"
"R80"
"1-2-5"
"E6"
"E12"
"E24"
"E48"
"E96"
"E192"
"POWERSOF2"
고려 사항
$bucketAuto
및 메모리 제한
$bucketAuto
단계의 RAM 제한은 100 메가바이트입니다. 기본값 으로 단계가 이 제한을 초과하면 MongoDB 자동으로 임시 파일을 디스크에 씁니다. 자세한 내용은 allowDiskUseByDefault
를 참조하세요.
행동
다음과 같은 경우 버킷 수가 지정된 수보다 적을 수 있습니다.
입력 문서 수가 지정된 버킷 수보다 적습니다.
groupBy
표현식의 고유 값 수가 지정된buckets
수보다 적습니다.granularity
의 간격은buckets
의 수보다 적습니다.granularity
은(는) 문서를 지정된 수의buckets
에 균등하게 배포할 만큼 세밀하지 않습니다.
groupBy
표현식이 배열이나 문서를 참조하는 경우 버킷 경계를 결정하기 전에 $sort
와(과) 동일한 순서를 사용하여 값이 정렬됩니다.
버킷 간에 문서가 균등하게 분산되는지 여부는 groupBy
필드의 카디널리티 또는 고유 값 수에 따라 달라집니다. 카디널리티가 충분히 높지 않으면 $bucketAuto 단계에서 결과를 버킷에 균등하게 분배하지 못할 수 있습니다.
세분성
은(는) 모든 버킷의 경계가 지정된 기본 설정 번호 시리즈 를 $bucketAuto
준수하도록 하는 선택적 매개 변수를 granularity
허용합니다. . 기본 숫자 시리즈를 사용하면 groupBy
표현식의 값 범위 중 버킷 경계가 설정되는 위치를 더 잘 제어할 수 있습니다. 또한 groupBy
표현식의 범위가 기하급수적으로 확장될 때 대수적으로 균등하게 버킷 경계를 설정하는 데 사용할 수 있습니다.
Renard 시리즈
Renard 급수는 10의 5번째, 10번째, 20번째, 40번째 또는 80번째 근을 취한 다음 1.0에서 10.0 사이의 값과 동일한 근의 다양한 거듭제곱을 포함합니다(R80
의 경우 10.3).
버킷 경계를 계열의 값으로 제한하려면 granularity
을(를) R5
, R10
, R20
, R40
또는 R80
로 설정합니다. groupBy
값이 1.0에서 10.0 (R80
경우 10.3) 범위를 벗어나는 경우 시리즈 값에 10의 거듭제곱을 곱합니다.
예시
R5
계열은 10의 다섯 번째 근인 1.58을 기반으로 하며 10에 도달할 때까지 이 근(반올림)의 다양한 거듭제곱을 포함합니다. R5
계열은 다음과 같이 파생됩니다.
10 0/5 = 1
10 1/5 = 1.584 ~ 1.6
10 2/5 = 2.511 ~ 2.5
10 3/5 = 3.981 ~ 4.0
10 4/5 = 6.309 ~ 6.3
10 5/5 = 10
동일한 접근 방식이 다른 Renard 급수에 적용되어 더 미세한 세분화를 제공합니다. 즉, 1.0과 10.0 사이에 더 많은 간격(R80
의 경우 10.3)을 제공합니다.
E 시리즈
E 수 1.0 10.0 6 급수는 에서 까지의 구간을12 일 , 일 , 24 일 , 일 , 48 일수로 세분한다는96 점에서 Renard 급수 192 와 유사 합니다 . , 또는 특정 상대 오류가 있는 인 10의 근 입니다.
버킷 경계를 계열의 값으로 제한하려면 granularity
, E6
, E12
, E24
, E48
, E96
또는 E192
로 설정합니다. groupBy
값이 1 를 벗어나면 시리즈 값에 10 의 거듭제곱을 곱합니다.0 ~ 10.0 범위. E 시리즈와 각각의 상대적 오류에 대해 자세히 알아보려면 기본 숫자 시리즈 를 참조하세요. .
1-2-5 급수
1-2-5
급수는 3값 Renard 급수처럼 작동합니다. (해당 급수가 존재하는 경우)
버킷 경계를 10의 세 번째 근(유효 자릿수 1개로 반올림)의 다양한 거듭제곱으로 제한하려면 granularity
을(를) 1-2-5
(으)로 설정합니다.
예시
1-2-5
계열의 일부인 값은 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000 등입니다.
두 시리즈의 힘
버킷 경계를 2의 거듭제곱인 숫자로 제한하려면 granularity
을(를) POWERSOF2
(으)로 설정합니다.
예시
다음 숫자는 두 시리즈의 거듭제곱을 따릅니다.
2 0 = 1
2 1 = 2
2 2 = 4
2 3 = 8
2 4 = 16
2 5 = 32
등등...
일반적인 구현 방식은 메모리와 같은 다양한 컴퓨터 구성 요소가 주로 선호하는 숫자로 구성된 POWERSOF2
세트를 준수하는 방식을 말합니다.
1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, and so on....
다양한 세분성 비교
다음 작업은 granularity
에 대해 다른 값을 지정하면 $bucketAuto
가 버킷 경계를 결정하는 방식에 어떤 영향을 미치는지 보여 줍니다. things
의 컬렉션에는 0에서 99까지 번호가 매겨진 _id
가 있습니다.
{ _id: 0 } { _id: 1 } ... { _id: 99 }
granularity
에 대한 다른 값은 다음 연산으로 대체됩니다.
db.things.aggregate( [ { $bucketAuto: { groupBy: "$_id", buckets: 5, granularity: <granularity> } } ] )
다음 표의 결과는 granularity
에 대한 서로 다른 값이 어떻게 서로 다른 버킷 경계를 생성하는지 보여줍니다.
세분성 | 결과 | 참고 사항 |
---|---|---|
세분화 없음 | { "_id" : { "min" : 0, "max" : 20 }, "count" : 20 } { "_id" : { "min" : 20, "max" : 40 }, "count" : 20 } { "_id" : { "min" : 40, "max" : 60 }, "count" : 20 } { "_id" : { "min" : 60, "max" : 80 }, "count" : 20 } { "_id" : { "min" : 80, "max" : 99 }, "count" : 20 } | |
R20 | { "_id" : { "min" : 0, "max" : 20 }, "count" : 20 } { "_id" : { "min" : 20, "max" : 40 }, "count" : 20 } { "_id" : { "min" : 40, "max" : 63 }, "count" : 23 } { "_id" : { "min" : 63, "max" : 90 }, "count" : 27 } { "_id" : { "min" : 90, "max" : 100 }, "count" : 10 } | |
E24 | { "_id" : { "min" : 0, "max" : 20 }, "count" : 20 } { "_id" : { "min" : 20, "max" : 43 }, "count" : 23 } { "_id" : { "min" : 43, "max" : 68 }, "count" : 25 } { "_id" : { "min" : 68, "max" : 91 }, "count" : 23 } { "_id" : { "min" : 91, "max" : 100 }, "count" : 9 } | |
1-2-5 | { "_id" : { "min" : 0, "max" : 20 }, "count" : 20 } { "_id" : { "min" : 20, "max" : 50 }, "count" : 30 } { "_id" : { "min" : 50, "max" : 100 }, "count" : 50 } | 지정된 버킷 수가 급수의 간격 수를 초과합니다. |
POWERSOF2 | { "_id" : { "min" : 0, "max" : 32 }, "count" : 32 } { "_id" : { "min" : 32, "max" : 64 }, "count" : 32 } { "_id" : { "min" : 64, "max" : 128 }, "count" : 36 } | 지정된 버킷 수가 급수의 간격 수를 초과합니다. |
예시
다음 문서가 포함된 artwork
컬렉션을 생각해 보세요.
{ "_id" : 1, "title" : "The Pillars of Society", "artist" : "Grosz", "year" : 1926, "price" : Decimal128("199.99"), "dimensions" : { "height" : 39, "width" : 21, "units" : "in" } } { "_id" : 2, "title" : "Melancholy III", "artist" : "Munch", "year" : 1902, "price" : Decimal128("280.00"), "dimensions" : { "height" : 49, "width" : 32, "units" : "in" } } { "_id" : 3, "title" : "Dancer", "artist" : "Miro", "year" : 1925, "price" : Decimal128("76.04"), "dimensions" : { "height" : 25, "width" : 20, "units" : "in" } } { "_id" : 4, "title" : "The Great Wave off Kanagawa", "artist" : "Hokusai", "price" : Decimal128("167.30"), "dimensions" : { "height" : 24, "width" : 36, "units" : "in" } } { "_id" : 5, "title" : "The Persistence of Memory", "artist" : "Dali", "year" : 1931, "price" : Decimal128("483.00"), "dimensions" : { "height" : 20, "width" : 24, "units" : "in" } } { "_id" : 6, "title" : "Composition VII", "artist" : "Kandinsky", "year" : 1913, "price" : Decimal128("385.00"), "dimensions" : { "height" : 30, "width" : 46, "units" : "in" } } { "_id" : 7, "title" : "The Scream", "artist" : "Munch", "price" : Decimal128("159.00"), "dimensions" : { "height" : 24, "width" : 18, "units" : "in" } } { "_id" : 8, "title" : "Blue Flower", "artist" : "O'Keefe", "year" : 1918, "price" : Decimal128("118.42"), "dimensions" : { "height" : 24, "width" : 20, "units" : "in" } }
단일 패싯 집계
다음 작업에서는 입력 문서가 price
필드의 값에 따라 4개의 버킷으로 그룹화됩니다.
db.artwork.aggregate( [ { $bucketAuto: { groupBy: "$price", buckets: 4 } } ] )
이 작업은 다음 문서를 반환합니다.
{ "_id" : { "min" : Decimal128("76.04"), "max" : Decimal128("159.00") }, "count" : 2 } { "_id" : { "min" : Decimal128("159.00"), "max" : Decimal128("199.99") }, "count" : 2 } { "_id" : { "min" : Decimal128("199.99"), "max" : Decimal128("385.00") }, "count" : 2 } { "_id" : { "min" : Decimal128("385.00"), "max" : Decimal128("483.00") }, "count" : 2 }
다면적 집계
$bucketAuto
단계는 $facet
단계 내에서 사용되어 artwork
의 동일한 입력 문서 세트에서 여러 집계 파이프라인을 처리할 수 있습니다.
다음 집계 파이프라인은 price
, year
및 계산된 area
를 기반으로 artwork
컬렉션의 문서를 버킷으로 그룹화합니다.
db.artwork.aggregate( [ { $facet: { "price": [ { $bucketAuto: { groupBy: "$price", buckets: 4 } } ], "year": [ { $bucketAuto: { groupBy: "$year", buckets: 3, output: { "count": { $sum: 1 }, "years": { $push: "$year" } } } } ], "area": [ { $bucketAuto: { groupBy: { $multiply: [ "$dimensions.height", "$dimensions.width" ] }, buckets: 4, output: { "count": { $sum: 1 }, "titles": { $push: "$title" } } } } ] } } ] )
연산은 다음 문서를 반환합니다.
{ "area" : [ { "_id" : { "min" : 432, "max" : 500 }, "count" : 3, "titles" : [ "The Scream", "The Persistence of Memory", "Blue Flower" ] }, { "_id" : { "min" : 500, "max" : 864 }, "count" : 2, "titles" : [ "Dancer", "The Pillars of Society" ] }, { "_id" : { "min" : 864, "max" : 1568 }, "count" : 2, "titles" : [ "The Great Wave off Kanagawa", "Composition VII" ] }, { "_id" : { "min" : 1568, "max" : 1568 }, "count" : 1, "titles" : [ "Melancholy III" ] } ], "price" : [ { "_id" : { "min" : Decimal128("76.04"), "max" : Decimal128("159.00") }, "count" : 2 }, { "_id" : { "min" : Decimal128("159.00"), "max" : Decimal128("199.99") }, "count" : 2 }, { "_id" : { "min" : Decimal128("199.99"), "max" : Decimal128("385.00") }, "count" : 2 }, { "_id" : { "min" : Decimal128("385.00"), "max" : Decimal128("483.00") }, "count" : 2 } ], "year" : [ { "_id" : { "min" : null, "max" : 1913 }, "count" : 3, "years" : [ 1902 ] }, { "_id" : { "min" : 1913, "max" : 1926 }, "count" : 3, "years" : [ 1913, 1918, 1925 ] }, { "_id" : { "min" : 1926, "max" : 1931 }, "count" : 2, "years" : [ 1926, 1931 ] } ] }
이 페이지의 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; } [ ] public DateTime LastUpdated { get; set; } }
참고
파스칼 케이스용 ConventionPack
이 페이지의 C# 클래스는 속성 이름에 파스칼식 대소문자를 사용하지만 MongoDB 컬렉션 의 필드 이름은 카멜식 대소문자를 사용합니다. 이러한 차이를 해소하기 위해 애플리케이션 시작될 때 다음 코드를 사용하여 ConventionPack
를 등록할 수 있습니다.
var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
MongoDB .NET/ C# 운전자 사용하여 $bucketAuto
집계 파이프라인 에 단계를 추가하려면 PipelineDefinition
객체 에서 BucketAuto() 메서드를 호출합니다.
다음 예시 Runtime
필드 값에 따라 문서를 5개의 버킷에 균등하게 배포하는 파이프라인 단계를 만듭니다.
var pipeline = new EmptyPipelineDefinition<Movie>() .BucketAuto( groupBy: m => m.Runtime, buckets: 5);
AggregateBucketAutoOptions 객체 사용하여 기본 숫자 기반 체계를 지정하여 경계 값을 설정하다 수 있습니다. 다음 예시 이전 예시 와 동일한 $bucketAuto
작업을 수행하지만 2의 거듭제곱으로 버킷 경계를 설정하기도 합니다.
var bucketAutoOptions = new AggregateBucketAutoOptions() { Granularity = new AggregateBucketAutoGranularity("POWERSOF2") }; var pipeline = new EmptyPipelineDefinition<Movie>() .BucketAuto( groupBy: m => m.Runtime, buckets: 5, options: bucketAutoOptions);