$bucket (バケット)
最終更新:2026-10-09
$bucket (バケット)
$bucket は、昇順の boundaries 配列で定義したバケットにドキュメントを分類し、バケットごとに { _id: lowerBound, count: N } を 1 つ出力します(出力アキュムレータも指定できます)。すべての境界の外にあるドキュメントは default バケットに入ります。ヒストグラムやレンジ統計に最適です。
| カテゴリ | グループ化とウィンドウ |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $bucket: { groupBy: <expression>, boundaries: [ <lowerBound>, ... ], default: <value>, output: { <field>: <accumulator> } } }
⚙️ パラメータ
| groupBy | ドキュメントがどのバケットに入るかを決定する式。 |
|---|---|
| boundaries | 昇順のバケット境界の配列。少なくとも2つの値。 |
| default | すべての境界外のドキュメント用のバケット名。省略したドキュメントは除外されます。 |
| output | バケットごとに計算されるアキュムレータ(例: $avg、$sum)。 |
戻り値:バケットごとに1つの { _id, count, ... } ドキュメント
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $bucket: スコアをレンジに分類し、バケットごとに平均を出力
db.scores.aggregate([
{ $bucket: {
groupBy: '$score',
boundaries: [0, 60, 80, 100],
default: 'other',
output: { avg: { $avg: '$score' } }
} }
])
出力:
{ "_id": 0, "count": 12, "avg": 35.5 }
{ "_id": 60, "count": 20, "avg": 71.2 }
📌 注意事項
- boundaries は昇順で、少なくとも 2 つの値が必要
- レンジは半開区間: 値は [boundaries[i], boundaries[i+1]) に入る
- 範囲外のドキュメントは default に入る。default を省略すると破棄される
🏷️ 関連タグ
💡 関連ケース
📚 関連チュートリアル
❓ よくある質問
Q$bucket と $bucketAuto の違いは?
A$bucket は明示的な境界を使います。$bucketAuto は件数が均等になるようにバケットを自動分割します。
Qレンジは半開区間ですか?
Aはい。値は [boundaries[i], boundaries[i+1]) に入り、最後の境界は上限として含まれません。
Qdefault バケットは省略できますか?
Aはい。省略すると全バケットの外のドキュメントは破棄されます。