$bucketAuto(集計)
定義
$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
フィールドは出力ドキュメントに含まれません。 次のとおり、output
ドキュメントの一部としてcount
式を明示的に指定して含めます。output: { <outputfield1>: { <accumulator>: <expression1> }, ... count: { $sum: 1 } } granularity
string
任意。 優先数値系列 を指定する string を使用して、計算された境界エッジが推奨されるラウンド数またはその10 で終了するようにします。
すべての
groupBy
値が数値で、いずれもNaN
でない場合にのみ使用できます。granularity
でサポートされている値は次のとおりです。"R5"
"R10"
"R20"
"R40"
"R80"
"1-2-5"
"E6"
"E12"
"E24"
"E48"
"E96"
"E192"
"POWERSOF2"
Considerations
$bucketAuto
およびメモリ制限
$bucketAuto
ステージには100メガバイトの RAM 制限があります。 デフォルトでは、 ステージがこの制限を超えると、 $bucketAuto
はエラーを返します。 ステージ処理のより多くのスペースを確保するには、 allowDiskUseオプションを使用して集計パイプライン ステージが一時ファイルにデータを書込むようにします。
動作
次の場合には、指定されたバケット数を下回る可能性があります。
入力ドキュメント数が指定されたバケット数より小さいです。
groupBy
式の一意の値の数は、buckets
の指定された数より小さいです。granularity
の間隔はbuckets
の数より少ないです。granularity
は、指定された数のbuckets
にドキュメントを均等に分散するのに十分ではありません。
groupBy
式が配列またはドキュメントを参照する場合、バケット境界を決定する前に、 $sort
と同じ順序で値が配置されます。
バケット間でのドキュメントの均等な分散は、 groupBy
フィールドの濃度または一意の値の数によって異なります。 濃度が十分に高くない場合、$bucketAuto ステージは結果をバケット間で均等に分散しない可能性があります。
粒度
は任意の$bucketAuto
granularity
パラメータを受け入れ、すべてのバケットの境界が指定された 優先数値系列 に準拠しているようにします 。優先数値系列を使用すると、 groupBy
式の値の範囲内でバケット境界が設定される場所をより制御できます。 また、 groupBy
式の範囲が指数的にスケーリングするときに、バケット境界を対数で均等に設定するためにも使用できます。
シャード シリーズ
レナード数値系列は、5番目の 、10番目の 、20番目の 、40番目の 、または 10 のルートのいずれかを取得して得られる数値のセットであり、1.0 から 10.0 までの値に等しいルートの累乗を含みます(10.3 では 10.3 ( R80
の場合)。
バケット境界を系列内の値に制限するには、 granularity
をR5
、 R10
、 R20
、 R40
、またはR80
に設定します。 groupBy
の値が 1.0 から 10.0( R80
では 10.3)の範囲外の場合、系列の値は 10 の累乗を掛けます。
例
R5
系列は 10 の 5 のルート(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
より細かい粒度、つまり 1.0 から 10.0( R80
では 10.3)の間隔が長くなります。
E シリーズ
E 番号系列は 1.010.0、 から までの間隔を6 th 、 th 、12 th 、 th 、 th ごとに細分化されている点で、 Renid シリーズ24 4896192と似ています。 、または と特定の 相対 エラーを持つ 10 のルート 。
バケット境界を系列内の値に制限するには、 granularity
をE6
、 E12
、 E24
、 E48
、 E96
、またはE192
に設定します。 シリーズの値は、 groupBy
の値が1の範囲外の場合、 10の累乗を掛けます。 0から10 。 0の範囲 E シリーズ とそれぞれの相対的なエラーの詳細については、次を参照してください。 。
1-2-5 シリーズ
1-2-5
シリーズは、 3 値のRapid シリーズのように動作します(このようなシリーズが存在する場合)。
granularity
を1-2-5
に設定すると、バケット境界を 10 の 3 ルート(1 桁に丸められた)のさまざまな累乗に制限します。
例
次の値は1-2-5
シリーズの一部です。0.1、0.2、0.5、1、2、5、10、20、50、100、200、500、1000、など
2 つの系列の累乗
バケット境界を 2 の累乗の数値に制限するには、 granularity
をPOWERSOF2
に設定します。
例
次の数値は 2 つの系列の累乗に依存します。
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" : 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
からの同じ入力ドキュメントセットに対して複数の集計パイプラインを処理できます。
次の集計パイプラインでは、 artwork
コレクションのドキュメントを、 price
、 year
、および計算されたarea
に基づいてバケットにグループ化します。
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 ] } ] }