$accumulator (カスタムアキュムレータ)
最終更新:2026-10-09
$accumulator (カスタムアキュムレータ)
$accumulator は、$group 内で JavaScript のコールバック — init・accumulate・merge・finalize — を使ってカスタム集計ロジックを定義します。組み込みアキュムレータでは表現できない集計ロジックをカバーします。サーバーサイドの JavaScript で動作するため、ネイティブアキュムレータより遅いです。
| カテゴリ | アキュムレータ |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $accumulator: { init: <function>, accumulate: <function>, accumulateArgs: [ <expression> ], merge: <function>, finalize: <function>, lang: "js" } }
戻り値:カスタム集約結果(型は指定した関数で決まります)
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $accumulator: Set でアイテムごとの個別価格数をカウント
db.sales.aggregate([
{ $group: { _id: '$item', uniq: {
$accumulator: {
init: function() { return new Set(); },
accumulate: function(set, v) { set.add(v); },
accumulateArgs: ['$price'],
merge: function(a, b) { for (var v of b) a.add(v); },
finalize: function(set) { return set.size; },
lang: 'js'
}
} }
])
出力:
// アイテムごとの個別価格の数
📌 注意事項
- サーバーサイド JavaScript で動作し、ネイティブアキュムレータより遅い
- コールバックは直列化可能でなければならず、外側の変数を捕捉できない
- merge コールバックはシャードや分散環境でグループ結果を結合する
🏷️ 関連タグ
💡 関連ケース
さらなる実践ケースを近日公開予定。
📚 関連チュートリアル
❓ よくある質問
Q$accumulator の速度は?
Aサーバーサイド JS で動作し、ネイティブアキュムレータより遅いため、避けられるなら避けます。
Q必須のコールバックはどれですか?
Ainit・accumulate・accumulateArgs が必須です。merge と finalize は任意です。
Qサーバーが JavaScript に対応していない場合は?
Aエラーになります。管理者が先にサーバーサイドスクリプトを有効にする必要があります。