定義
ウィンドウ内の配列値内の一意の要素の配列を返します。
バージョン8.1の新機能。
注意
曖昧さ回避
このページでは、ウィンドウ関数として使用する場合の$setUnion について説明します。
次の他のコンテキストでは $setUnion を使用することもできます。
$setUnion (accumulator)は、ドキュメントのグループ全体の 配列値内の一意の要素の 1 つの配列を返します。$setUnion (expression)は、2 つ以上の配列を一意の要素の単一の配列に結合します。
構文
{ $setWindowFields: { ... output: { <field>: { $setUnion: <array field> } } } }
動作
$setUnion 配列をセットとして扱い、配列に対してセット操作を実行します。配列に重複するエントリが含まれている場合、$setUnion は重複するエントリを無視します。 $setUnion は要素の順序を無視します。
$setUnion は結果内の重複を除外して、一意のエントリのみを含む配列を出力します。出力配列内の要素の順序は指定されていません。
セットにネストされた配列要素が含まれている場合、$setUnion はネストされた配列に下降 せず 、最上位の配列を評価します。
$setUnionがネストされた配列要素をどのように処理するかについては、$setUnion (expression) セクションの例を参照してください。
null であるか、null に解決される引数は結果に含まれます。欠落しているフィールドを参照する引数は結果に含まれません。
例
このページの例では、 sample_mflix データセット のデータを使用します。このデータセットを自己管理型MongoDBデプロイにロードする 方法の詳細については、「 サンプル データセットをロードする 」を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
この例では、$setWindowFields を使用して、監督の映画のジャンルが時間の経過とともにどのように蓄積されるかを示します。各ドキュメントには、最初の映画から現在の映画までの一意のジャンルが与えられます。
db.movies.aggregate( [ { $match: { directors: "Christopher Nolan" } }, { $setWindowFields: { sortBy: { year: 1 }, output: { genresSoFar: { $setUnion: "$genres", window: { documents: [ "unbounded", "current" ] } } } } }, { $project: { _id: 0, title: 1, year: 1, genres: 1, genresSoFar: 1 } } ] )
先行するパイプライン:
$matchを使用して、クリストための映画をフィルタリングします。$setWindowFieldsを使用して映画をyear$setUniongenres[ "unbounded", "current" ]でソートし、 のドキュメントウィンドウの フィールドに を適用します。genresSoFarフィールドには、ソート順の最初の映画から現在の映画までの一意のジャンルが保持されます。$projecttitleを使用して、 、year、genres、genresSoFarを出力に含めます。
genresSoFar 配列は、各映画がまだ出現していないジャンルに貢献するにつれて大きくなります。 The Dark Knight Rises と Interstellar は新しいジャンルを追加しないため、それらのウィンドウは Inception と同じセットを返します。