定義
特定のウィンドウからすべての一意の値の配列を返します。
返される配列内の要素の順序は指定されていません。
注意
曖昧さ回避
このページでは、ウィンドウ関数として使用する場合の$addToSet について説明します。
次の他のコンテキストでは $addToSet を使用することもできます。
$addToSet (accumulator)は、入力ドキュメントの変数に基づいて単一の集計値を返します。$addToSet (update operator)は、ドキュメントの配列フィールドに要素を追加します。
構文
{ $setWindowFields: { ... output: { <field>: { $addToSet: <expression> } } } }
動作
式の値が配列の場合、$addToSet は配列全体を 単一の 要素として追加します。
式の値がドキュメントの場合、その配列内の別のドキュメントが、これから追加されるドキュメントと完全に一致すれば、MongoDB ではそのドキュメントが重複していると判断されます。具体的には、既存のドキュメントにまったく同じフィールドと値がまったく同じ順序で含まれている場合です。
例
このページの例では、 sample_mflix データセット のデータを使用します。このデータセットを自己管理型MongoDBデプロイにロードする 方法の詳細については、「 サンプル データセットをロードする 」を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
この例では、 $addToSetウィンドウ関数を使用して、映画全体で一意のジャンルが時間の経過とともにどのように蓄積されるかを示します。映画はタイトル別にアルファベット順にソートされ、ウィンドウ関数は結果セットの先頭から現在の映画までの映画に出現するすべての固有のジャンルを追跡します。
db.movies.aggregate( [ { $match: { year: 2002, genres: { $exists: true, $ne: [] } } }, { $group: { _id: { year: "$year", title: "$title", genre: { $first: "$genres" } }, } }, { $setWindowFields: { sortBy: { "_id.title": 1 }, output: { genresSeenSoFar: { $addToSet: "$_id.genre", window: { documents: [ "unbounded", "current" ] } } } } }, { $project: { _id: 0, year: "$_id.year", title: "$_id.title", genre: "$_id.genre", genresSeenSoFar: 1, uniqueGenreCount: { $size: "$genresSeenSoFar" } } }, { $limit: 8 } ] )
この例では、次のことが行われます。
$matchステージでは、ジャンル情報を持つ2002 の映画がフィルタリングされます。$groupステージは、年、タイトル、genres配列の最初のジャンルでグループ化されます。$setWindowFields$addToSetステージでは、unboundedをcurrentから のウィンドウと併用して、結果セットの先頭から現在のドキュメントまでの一意のジャンルを累積します。$projectuniqueGenreCountステージは出力を再形成し、セット サイズがどのように増加するかを示す を計算します。$limit8ステージの出力は ドキュメントに制限されます。
出力は、$addToSet がドキュメント全体で一意のジャンルを蓄積する方法を示しています。各映画がセットにジャンルを追加するにつれて、genresSeenSoFar は 1 ジャンルから 7 ジャンルに増えます。 7 番目のドキュメント('3 Extremes II')の uniqueGenreCount は 6 番目のドキュメントと同じです。これは、そのジャンル(ジャンル)がすでにセット内にあったためです。これは、$addToSet が一意の値のみを追加し、重複を無視することを示しています。