定義
ウィンドウ内の各ドキュメントに式を適用した結果得られる重複を含むすべての値の配列を返します。
注意
曖昧さ回避
このページでは、ウィンドウ関数として使用する場合の$push について説明します。
次の他のコンテキストでは $push を使用することもできます。
$push (accumulator)は、グループ内の各ドキュメントに式を適用した後に結果の配列を返します。$push (update operator)は、ドキュメント内の配列フィールドに値を追加します。
構文
{ $setWindowFields: { ... output: { <field>: { $push: <expression> } } } }
動作
$push には、重複を含む、ウィンドウ内のすべての値が含まれます。出力配列内の要素の順序は、$setWindowFieldssortBy フィールドで指定されたソート順序に対応します。
例
このページの例では、 sample_mflix データセット のデータを使用します。このデータセットを自己管理型MongoDBデプロイにロードする 方法の詳細については、「 サンプル データセットをロードする 」を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
この例では、 $pushウィンドウ関数を使用して、2002 から映画全体のジャンルの実行中のリストを作成します。各映画ごとに、$push は映画のプライマリジャンルを genresSeenSoFar に追加し、重複を含むすべての値を保持します。
db.movies.aggregate( [ { $match: { year: 2002, genres: { $exists: true, $ne: [] } } }, { $addFields: { primaryGenre: { $first: "$genres" } } }, { $setWindowFields: { sortBy: { title: 1 }, output: { genresSeenSoFar: { $push: "$primaryGenre", window: { documents: [ "unbounded", "current" ] } } } } }, { $project: { _id: 0, genresSeenSoFar: "$genresSeenSoFar", year: "$year", title: "$title", genre: "$primaryGenre", totalGenreCount: { $size: "$genresSeenSoFar" } } }, { $limit: 8 } ] )
この例では、次のことが行われます。
$matchステージでは、ジャンル情報を持つ2002 の映画がフィルタリングされます。$addFieldsステージでは、primaryGenre配列の最初の要素を含むgenresフィールドが追加されます。$setWindowFields$pushステージでは、unboundedをcurrentから のウィンドウと併用して、結果セットの先頭から現在のドキュメントまでのすべてのジャンルを累積します。$projectステージでは出力を再形成し、totalGenreCountを計算して、配列が各ドキュメントごとにどのように増加するかを示します。$limitステージでは、読みやすくするために出力が8 ドキュメントに制限されています。
totalGenreCount は、ドキュメントごとに 1 ずつ増加します。 7 番目のドキュメント('3 Extremes II' )のジャンル「1」は、すでに配列内にあったため、Horror はHorror に 2 回表示されます。これは、一意の値のみを追加するgenresSeenSoFar $push$addToSetとは異なり、 には重複した値が含まれていることを示しています。