$bucketAuto (aggregation)
정의
$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 제한은 100MB입니다. 이 단계에서 해당 한도를 초과하면 $bucketAuto
이 기본값으로 오류를 반환합니다. 단계 처리 공간을 더 확보하려면 allowDiskUse 옵션을 사용하여 집계 파이프라인 단계가 임시 파일에 데이터를 쓸 수 있도록 설정하세요.
팁
다음도 참조하세요.
행동
다음과 같은 경우 버킷 수가 지정된 수보다 적을 수 있습니다.
입력 문서 수가 지정된 버킷 수보다 적습니다.
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 의 간격을 세분한다는 점에서 Renard 급수 와 유사합니다.0 ~ 10. 특정 상대 오차가 있는 10의 6 0 , 12 번째, 24 번째, 48 번째, 96 번째 또는 192 번째 근으로 .
버킷 경계를 계열의 값으로 제한하려면 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 등 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": { "최소": 0, "최대": 20 }, "count": 20 } { "_id" : { "min" : 20, "max" : 40 }, "count" : 20 } { "_id" : { "min" : 40, "max" : 60 }, "count" : 20 } { "_id": { "최소": 60, "최대": 80 }, "count": 20 } { "_id": { "최소": 80, "최대": 99 }, "count": 20 } | |
R20 | { "_id": { "최소": 0, "최대": 20 }, "count": 20 } { "_id" : { "min" : 20, "max" : 40 }, "count" : 20 } { "_id": { "최소": 40, "최대": 63 }, "count": 23 } { "_id" : { "min" : 63, "max" : 90 }, "count" : 27 } { "_id" : { "min" : 90, "max" : 100 }, "count" : 10 } | |
E24 | { "_id": { "최소": 0, "최대": 20 }, "count": 20 } { "_id" : { "min" : 20, "max" : 43 }, "count" : 23 } { "_id": { "최소": 43, "최대": 68 }, "count": 25 } { "_id": { "최소": 68, "최대": 91 }, "count": 23 } { "_id": { "최소": 91, "최대": 100 }, "count": 9 } | |
1 - 2 - 5 | { "_id": { "최소": 0, "최대": 20 }, "count": 20 } { "_id": { "최소": 20, "최대": 50 }, "count": 30 } { "_id" : { "min" : 50, "max" : 100 }, "count" : 50 } | 지정된 버킷 수가 급수의 간격 수를 초과합니다. |
POWERSOF2 | {" _id ": {" min ": 0, " 최대 ": 32}, " 카운트 ": 32} { "_id": { "최소": 32, "최대": 64 }, "count": 32 } { "_id": { "최소": 64, "최대": 128 }, "개수": 36 } | 지정된 버킷 수가 급수의 간격 수를 초과합니다. |
예제
다음 문서가 포함된 artwork
컬렉션을 생각해 보세요.
{ "_id" : 1, "title" : "The Pillars of Society", "artist" : "Grosz", "year" : 1926, "price" : NumberDecimal("199.99"), "dimensions" : { "height" : 39, "width" : 21, "units" : "in" } } { "_id" : 2, "title" : "Melancholy III", "artist" : "Munch", "year" : 1902, "price" : NumberDecimal("280.00"), "dimensions" : { "height" : 49, "width" : 32, "units" : "in" } } { "_id" : 3, "title" : "Dancer", "artist" : "Miro", "year" : 1925, "price" : NumberDecimal("76.04"), "dimensions" : { "height" : 25, "width" : 20, "units" : "in" } } { "_id" : 4, "title" : "The Great Wave off Kanagawa", "artist" : "Hokusai", "price" : NumberDecimal("167.30"), "dimensions" : { "height" : 24, "width" : 36, "units" : "in" } } { "_id" : 5, "title" : "The Persistence of Memory", "artist" : "Dali", "year" : 1931, "price" : NumberDecimal("483.00"), "dimensions" : { "height" : 20, "width" : 24, "units" : "in" } } { "_id" : 6, "title" : "Composition VII", "artist" : "Kandinsky", "year" : 1913, "price" : NumberDecimal("385.00"), "dimensions" : { "height" : 30, "width" : 46, "units" : "in" } } { "_id" : 7, "title" : "The Scream", "artist" : "Munch", "price" : NumberDecimal("159.00"), "dimensions" : { "height" : 24, "width" : 18, "units" : "in" } } { "_id" : 8, "title" : "Blue Flower", "artist" : "O'Keefe", "year" : 1918, "price" : NumberDecimal("118.42"), "dimensions" : { "height" : 24, "width" : 20, "units" : "in" } }
단일 패싯 집계
다음 작업에서는 입력 문서가 price
필드의 값에 따라 4개의 버킷으로 그룹화됩니다.
db.artwork.aggregate( [ { $bucketAuto: { groupBy: "$price", buckets: 4 } } ] )
이 작업은 다음 문서를 반환합니다.
{ "_id" : { "min" : NumberDecimal("76.04"), "max" : NumberDecimal("159.00") }, "count" : 2 } { "_id" : { "min" : NumberDecimal("159.00"), "max" : NumberDecimal("199.99") }, "count" : 2 } { "_id" : { "min" : NumberDecimal("199.99"), "max" : NumberDecimal("385.00") }, "count" : 2 } { "_id" : { "min" : NumberDecimal("385.00"), "max" : NumberDecimal("483.00") }, "count" : 2 }
다면적 집계
$bucketAuto
단계는 $facet
단계 내에서 사용되어 artwork
의 동일한 입력 문서 세트에서 여러 집계 파이프라인을 처리할 수 있습니다.
다음 aggregation pipeline은 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" : NumberDecimal("76.04"), "max" : NumberDecimal("159.00") }, "count" : 2 }, { "_id" : { "min" : NumberDecimal("159.00"), "max" : NumberDecimal("199.99") }, "count" : 2 }, { "_id" : { "min" : NumberDecimal("199.99"), "max" : NumberDecimal("385.00") }, "count" : 2 }, { "_id" : { "min" : NumberDecimal("385.00"), "max" : NumberDecimal("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 ] } ] }