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

$addToSet(ウィンドウ関数)

$addToSet

特定のウィンドウからすべての一意の値の配列を返します。

返される配列内の要素の順序は指定されていません。

注意

曖昧さ回避

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

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

{
$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 が一意の値のみを追加し、重複を無視することを示しています。

このページを評価