定義
ウィンドウから入力ドキュメントをマージして作成されたドキュメントを返します。
注意
曖昧さ回避
このページでは、ウィンドウ関数として使用する場合の$mergeObjects について説明します。
次の他のコンテキストでは $mergeObjects を使用することもできます。
$mergeObjects (accumulator)は、入力ドキュメントのグループにまたがるマージされたドキュメントを返します。$mergeObjects (expression)は、ドキュメントの配列を単一のドキュメントにマージします。
構文
{ $setWindowFields: { output: { <outputField>: { $mergeObjects: <document>, window: { <documents|range>: [ "unbounded", <upper> ] } } } } }
注意
の sortBy $setWindowFieldsオプションは、上限ウィンドウが"unbounded" の場合、またはwindow が省略されている場合に任意です。上限ウィンドウがsortBy でない場合( など)には"unbounded" "current"が必要です。
sortBy を省略した場合、$mergeObjects が競合するフィールド名を解決する順序は保証されません。
コマンドフィールド
フィールド | タイプ | 必要性 | 説明 |
|---|---|---|---|
| 式 | 必須 | ドキュメントを評価するフィールド名または式。 |
| ドキュメント | 任意 |
|
動作
削除できないWindows
$mergeObjects は削除不可のウィンドウのみをサポートするため、下限は "unbounded" です。下限が "unbounded" でないウィンドウを指定すると、操作はエラーを返します。
Null 入力処理
$mergeObjects は null 入力値を無視します。すべての入力値が null の場合、$mergeObjects は空のドキュメント{ } を返します。
フィールド上書きの動作
$mergeObjects は、ドキュメントをマージするときにフィールド値を上書きします。複数の入力ドキュメントが同じフィールド名を含む場合、出力には、競合するフィールドを含む最後の入力ドキュメントの値が含まれます。
例
productUpdates コレクションを作成します。
db.productUpdates.insertMany( [ { _id: 1, product: "gadget", date: ISODate("2024-01-01"), specs: { color: "blue" } }, { _id: 2, product: "gadget", date: ISODate("2024-01-02"), specs: { size: "medium" } }, { _id: 3, product: "gadget", date: ISODate("2024-01-03"), specs: { weight: 0.5 } }, { _id: 4, product: "widget", date: ISODate("2024-01-01"), specs: { color: "red" } }, { _id: 5, product: "widget", date: ISODate("2024-01-02"), specs: { material: "plastic" } } ] )
各ドキュメントは、新しい仕様フィールドを追加する製品の更新を表します。各アップデートはspecsサブドキュメントに異なるフィールド名を提供するため、ウィンドウが展開するにつれて$mergeObjectsは完全な仕様プロファイルを蓄積できます。
次のパイプラインでは、$mergeObjects の$setWindowFields を使用して、新しい仕様がウィンドウに追加されるにつれて累積更新される製品仕様のリストを返します。各ドキュメントについて、 には現在のドキュメントまでのすべての更新からのマージされた仕様が含まれています。cumulativeSpecs
db.productUpdates.aggregate( [ { $setWindowFields: { partitionBy: "$product", sortBy: { date: 1 }, output: { cumulativeSpecs: { $mergeObjects: "$specs", window: { documents: [ "unbounded", "current" ] } } } } }, { $sort: { product: 1, date: 1 } }, { $project: { _id: 0, product: 1, date: 1, specs: 1, cumulativeSpecs: 1 } } ] )
上記のパイプラインでは、
はドキュメントを
$setWindowFieldsで分割し、productで昇順にソートします。date$mergeObjectsはunboundedからcurrentのウィンドウを使用して、各パーティションの先頭から現在のドキュメントまですべてのspecsドキュメントをマージし、実行中の累積仕様を生成します。$sortは最終結果をproductとdateで昇順にソートします。