AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

$unionWith(集計ステージ)

$unionWith

2 つの集計を 1 つの結果セットに結合します。 $unionWithは結合された結果セット(重複を含む)を次のステージに出力します。

結合された結果セットのドキュメントが出力される順序は指定されていません。

$unionWith ステージの構文は次のとおりです。

{ $unionWith: { coll: "<collection>", pipeline: [ <stage1>, ... ] } }

指定したコレクションの全ドキュメントを処理せずに含めるには、簡略化された形式を使用できます。

{ $unionWith: "<collection>" } // Include all documents from the specified collection

$unionWithステージは、次のフィールドを持つドキュメントを取得します。

フィールド
必要性
説明

pipeline を省略する場合は必須です。それ以外は任意です。

結果セットに含めるパイプラインの結果のコレクションまたはビュー。

collフィールドを省略する場合は、$documents の最初のステージを持つpipelineフィールドを指定する必要があります

coll を省略する場合は必須です。それ以外は任意です。

入力ドキュメントに適用する集計パイプライン。

  • collを指定すると、パイプラインはcollのドキュメントに適用されます。

  • coll を省略すると、パイプラインはパイプライン内の $documents ステージのドキュメントに適用されます。例えについては、「指定されたドキュメントとの Union の作成」を参照してください。

パイプラインには $out ステージと $merge ステージを含めることはできません。v6.0 以降では、 pipeline にはパイプライン内の最初のステージとして Atlas Search $search ステージを含めることができます。詳しくは「Atlas Search サポート」を参照してください。

$unionWith操作は、次の SQL ステートメントに対応します。

SELECT *FROM Collection1WHERE ...UNION ALLSELECT *FROM Collection2WHERE ...

前のステージと $unionWith ステージから組み合わせた結果には重複が含まれる場合があります。

例、次の集計は、moviesコレクションに対する 2 つのクエリからの titleフィールドのプロジェクション結果を組み合わせたものです。結果セットには重複が含まれています。

db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $project: { title: 1, _id: 0 } }, { $unionWith: { coll: "movies", pipeline: [ { $match: { runtime: { $gt: 1000 } } }, { $project: { title: 1, _id: 0 } } ] } }] )
[ { title: 'Centennial' }, { title: 'Baseball' }, { title: 'Centennial' }, { title: 'Baseball' }]

重複を削除するには、$group ステージを追加して、title フィールドでグループ化します。結果セットには重複が含まれなくなりました。

db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $project: { title: 1, _id: 0 } }, { $unionWith: { coll: "movies", pipeline: [ { $match: { runtime: { $gt: 1000 } } }, { $project: { title: 1, _id: 0 } } ] } }, { $group: { _id: "$title" } }, { $sort: { _id: 1 } }] )
[ { _id: 'Baseball' }, { _id: 'Centennial' }]

db.collection.aggregate()にcollationドキュメントが含まれている場合、その照合が操作に使用され、他の照合は無視されます。

db.collection.aggregate()にcollationドキュメントが含まれていない場合、 db.collection.aggregate()メソッドは、 db.collection.aggregate()が実行される最上位のコレクションやビューの照合を使用します。

  • $unionWith coll がコレクションの場合、その照合は無視されます。

  • $unionWith coll がビューの場合、その照合は最上位のコレクションやビューの照合と一致する必要があります。そうでない場合はエラーとなります。

MongoDB 6.0 以降では、 $unionWith パイプラインで Atlas Search $search または $searchMeta ステージを指定して、Atlas クラスター上のコレクションを検索できます。$search または $searchMeta ステージは、 $unionWith パイプライン内の最初のステージである必要があります。

$unionWithとともに$search を使用した例については、Atlas Search チュートリアルの「 $unionWith を使用して Atlas Search $search クエリを実行する 」を参照してください。

制限事項
説明

集計パイプラインでは、 トランザクション$unionWith 内で を使用できません。

$unionWith パイプラインには$outステージを含めることはできません。

$unionWith パイプラインには$mergeステージを含めることはできません。

このページの例では、sample_mflix データセット のデータを使用しています。自己管理型 MongoDB 配置にこのデータセットをロードする方法の詳細については、「サンプル データセットのロード」を参照してください。サンプル データベースに何らかの変更を加えた場合は、今ページの例を実行するには、データベースを削除して再作成する必要がある可能性があります。

次の例では、$unionWith ステージを使用してデータを結合し、movies コレクションから結果を返します。

次の集計では、カテゴリ別に映画をリストする映画レポートが作成されます。パイプラインは$unionWith を使用してmovies コレクションのドキュメントを結合します。

db.movies.aggregate( [ { $match: { year: { $lt: 1910 } } }, { $set: { category: "Early Cinema" } }, { $unionWith: { coll: "movies", pipeline: [ { $match: { runtime: { $gt: 1000 } } }, { $set: { category: "Long Runtime" } } ] } }, { $project: { title: 1, year: 1, category: 1, _id: 0 } }, { $sort: { category: 1, year: 1, title: 1 } }] )
[ { title: 'The Kiss', year: 1896, category: 'Early Cinema' }, { title: 'The Kiss', year: 1896, category: 'Early Cinema' }, { title: 'The Great Train Robbery', year: 1903, category: 'Early Cinema' }, { title: 'A Corner in Wheat', year: 1909, category: 'Early Cinema' }, { title: 'Centennial', year: 1978, category: 'Long Runtime' }, { title: 'Baseball', year: 1994, category: 'Long Runtime' }]

具体的には、集計パイプラインでは次のものが使用されます。

  • $matchより前にリリースされた映画を選択するための ステージ1910

  • 値 $setを持つ フィールドを追加するcategoryEarly Cinema ステージ。

  • $unionWithmoviesコレクションのドキュメントを結合するためのruntime 1000Long Runtimeステージは、 が より大きい映画にフィルタリングし、 カテゴリでタグ付けされます。

  • 、 、 $projectフィールドのみを返す ステージ。titleyearcategory

  • $sortcategoryyear、 、 で並べ替えるtitle ステージ。

次の集計では、ジャンルごとの合計実行時間を一覧表示する映画レポートが作成されます。パイプラインは$unionWith を使用してmovies コレクションのドキュメントを結合します。

db.movies.aggregate( [ { $match: { year: { $lt: 1910 } } }, { $unionWith: { coll: "movies", pipeline: [ { $match: { runtime: { $gt: 1000 } } } ] } }, { $group: { _id: "$genres", totalRuntime: { $sum: "$runtime" } } }, { $sort: { totalRuntime: -1 } }] )
[ { _id: [ 'Action', 'Adventure', 'Drama' ], totalRuntime: 1256 }, { _id: [ 'Documentary', 'History', 'Sport' ], totalRuntime: 1140 }, { _id: [ 'Short', 'Drama' ], totalRuntime: 14 }, { _id: [ 'Short', 'Western' ], totalRuntime: 11 }, { _id: [ 'Short', 'Romance' ], totalRuntime: 2 }]
  • $match$unionWithステージとmovies ステージは、 コレクションからドキュメントをパイプラインに取得します。

  • ステージは フィールドでグループ化し、 $groupgenresを使用して$sum 値ごとの合計 を計算します。runtimegenres

  • $sort ステージでは、ドキュメントを totalRuntime の降順で並べ替えます。

$unionWithを使用して、 pipelineフィールドに指定したドキュメントとの和集合を実行できます。 pipelineフィールドに$documentsステージを指定すると、別のコレクションに保存されていないドキュメントとの和集合が実行されます。

次の$unionWith操作は、 pipeline $documentsフィールドに指定されたドキュメントとの和集合を実行します。

db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $project: { title: 1, year: 1, _id: 0 } }, { $unionWith: { pipeline: [ { $documents: [ { title: "Movie A", year: 2000 }, { title: "Movie B", year: 2001 } ] } ] } }] )
[ { title: 'Centennial', year: 1978 }, { title: 'Baseball', year: 1994 }, { title: 'Movie A', year: 2000 }, { title: 'Movie B', year: 2001 }]