$setWindowFields (ウィンドウフィールド)
最終更新:2026-10-09
$setWindowFields (ウィンドウフィールド)
$setWindowFields は、パーティション内でウィンドウ計算 — 順位、移動平均、累計 — を行い、結果を各ドキュメントに書き戻します。出力フィールドにウィンドウ演算子($rank、$denseRank やアキュムレータ)を指定し、sortBy で順序を、任意でウィンドウ範囲を指定します。SQL のウィンドウ関数に相当します。
| カテゴリ | グループ化とウィンドウ |
|---|---|
| MongoDB バージョン | 5.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $setWindowFields: { partitionBy: <expression>, sortBy: { <field>: <1 or -1> }, output: { <field>: { <windowOperator>: ..., window: { documents: [...], range: [...] } } } } }
⚙️ パラメータ
| partitionBy | パーティション式。省略した場合、すべてのドキュメントが1つのパーティションを形成します。 |
|---|---|
| sortBy | パーティション内の並び順。ウィンドウ計算の順序を決定します。 |
| output | ウィンドウ演算子の定義を持つ出力フィールド。 |
戻り値:ウィンドウ計算フィールドを追加したドキュメントストリーム
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $setWindowFields: 地域ごとの累計を計算
db.sales.aggregate([
{ $setWindowFields: {
partitionBy: '$region',
sortBy: { date: 1 },
output: {
runningTotal: { $sum: '$amount', window: { documents: ['unbounded', 'current'] } }
}
} }
])
出力:
// 各売上に累計が付く
{ "region": "EAST", "date": "2024-01-02", "amount": 30, "runningTotal": 30 }
📌 注意事項
- 出力フィールドが少なくとも 1 つ必要。sortBy とウィンドウ演算子が計算順を決める
- ウィンドウ範囲は documents または range で表現する
- partitionBy を省略するとストリーム全体が 1 つのパーティションになる
🏷️ 関連タグ
💡 関連ケース
📚 関連チュートリアル
❓ よくある質問
Q$setWindowFields と $group の違いは?
A$group はグループを 1 つのドキュメントに畳みます。$setWindowFields はすべてのドキュメントを保持し、ウィンドウ計算の結果を各ドキュメントに書き戻します。
Q移動平均を計算できますか?
Aはい。ウィンドウを直前 7 件から現在までに設定し、$avg アキュムレータを使います。
Qウィンドウ範囲はどう書きますか?
Aたとえば { documents: ['unbounded', 'current'] } はパーティションの先頭から現在のドキュメントまでを範囲にします。range は値の区間を定義します。