aggregate() (アグリゲーションパイプライン)
最終更新:2026-10-09
aggregate() (アグリゲーションパイプライン)
aggregate() はドキュメントをグループ化・計算・再形成する多段パイプラインを実行します。例: `db.users.aggregate([{ $group: { _id: '$city', total: { $sum: 1 } } }])`。$match、$group、$sort、$project などのステージがデータを順番に変換します。find() よりはるかに強力で、レポート作成やピボットの定番です。パイプラインはサーバー側で実行され、カーソル(またはインライン結果)を返します。
| カテゴリ | 読み取り |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
db.<collection>.aggregate(<pipeline>, { allowDiskUse: <bool> })
⚙️ パラメータ
| パイプライン配列 | パイプラインステージの配列(例: [{$match: {...}}, {$group: {...}}])。 |
|---|---|
| allowDiskUse | 任意。true にすると 100MB を超える中間結果をディスクに退避できます。 |
戻り値:集計結果のカーソル。$out/$merge がコレクションに書き込む場合は空。
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// aggregate: 都市ごとにユーザー数を集計する
const result = db.users.aggregate([
{ $group: { _id: '$address.city', total: { $sum: 1 } } },
{ $sort: { total: -1 } }
])
result.toArray()
出力:
[
{ _id: 'Beijing', total: 12 },
{ _id: 'Shanghai', total: 8 }
]
📌 注意事項
- ステージの順序が重要。$match を先に置いてできるだけ早く絞り込む
- ステージのデフォルトのメモリ上限は 100MB。allowDiskUse: true で超えられる
- $group の _id 内で元のフィールドを参照するには $ プレフィックスを使う。例: '$age'
🏷️ 関連タグ
💡 関連ケース
📚 関連チュートリアル
❓ よくある質問
Qaggregate と find の違いは何ですか?
Afind() はクエリとプロジェクションのみです。aggregate() はグループ化・カウント・合計・結合ができ、レポート作成向けです。
Qアグリゲーションがメモリ上限を超えたらどうしますか?
A{allowDiskUse: true} を渡して中間結果をディスクに書き出すか、早い段階の $match で最適化します。
Qアグリゲーションの結果はどう消費しますか?
Aカーソルを返すので .toArray() を呼ぶか反復します。$out を使うと結果はコレクションに格納され、カーソルは空で戻ってきます。