AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

$mergeObjects(ウィンドウ関数)

$mergeObjects

バージョン8.3の新機能。

ウィンドウから入力ドキュメントをマージして作成されたドキュメントを返します。

注意

曖昧さ回避

このページでは、ウィンドウ関数として使用する場合の$mergeObjects について説明します。

次の他のコンテキストでは $mergeObjects を使用することもできます。

{
$setWindowFields: {
output: {
<outputField>: {
$mergeObjects: <document>,
window: {
<documents|range>: [ "unbounded", <upper> ]
}
}
}
}
}

注意

の sortBy $setWindowFieldsオプションは、上限ウィンドウが"unbounded" の場合、またはwindow が省略されている場合に任意です。上限ウィンドウがsortBy でない場合( など)には"unbounded" "current"が必要です。

sortBy を省略した場合、$mergeObjects が競合するフィールド名を解決する順序は保証されません。

フィールド
タイプ
必要性
説明

<document>

式

必須

ドキュメントを評価するフィールド名または式。 $percentile は、ウィンドウ内のすべてのドキュメントのドキュメント値をマージします。

window

ドキュメント

任意

$percentile が操作するドキュメントのウィンドウを指定します。下限は "unbounded" である必要があります。省略した場合、ウィンドウにはパーティション内のすべてのドキュメントが含まれます。

$mergeObjects は削除不可のウィンドウのみをサポートするため、下限は "unbounded" です。下限が "unbounded" でないウィンドウを指定すると、操作はエラーを返します。

$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 で昇順にソートします。

このページを評価