Docs Menu
Docs Home
/
MongoDB マニュアル
/ / /

$bucketAuto(集計)

項目一覧

  • 定義
  • Considerations
  • 動作
$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"

$bucketAutoステージには100メガバイトの RAM 制限があります。 デフォルトでは、 ステージがこの制限を超えると、 $bucketAutoはエラーを返します。 ステージ処理のより多くのスペースを確保するには、 allowDiskUseオプションを使用して集計パイプライン ステージが一時ファイルにデータを書込むようにします。

Tip

以下も参照してください。

次の場合には、指定されたバケット数を下回る可能性があります。

  • 入力ドキュメント数が指定されたバケット数より小さいです。

  • 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の場合)。

バケット境界を系列内の値に制限するには、 granularityR5R10R20R40 、または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 番号系列は 1.010.0、 から までの間隔を6 th 、 th 、12 th 、 th 、 th ごとに細分化されている点で、 Renid シリーズ24 4896192と似ています。 、または と特定の 相対 エラーを持つ 10 のルート 。

バケット境界を系列内の値に制限するには、 granularityE6E12E24E48E96 、またはE192に設定します。 シリーズの値は、 groupByの値が1の範囲外の場合、 10の累乗を掛けます。 0から10 。 0の範囲 E シリーズ とそれぞれの相対的なエラーの詳細については、次を参照してください。 。

1-2-5シリーズは、 3 値のRapid シリーズのように動作します(このようなシリーズが存在する場合)。

granularity1-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 の累乗の数値に制限するには、 granularityPOWERSOF2に設定します。

次の数値は 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コレクションのドキュメントを、 priceyear 、および計算された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 ] }
]
}

戻る

$bucket