定義
指定ソート順に従って、ウィンドウ内の最上位の要素を返します。
注意
曖昧さ回避
このページでは、ウィンドウ関数として使用する場合の$top について説明します。次の他のコンテキストでは を使用することもできます。$top
$top (expression operator)は、指定されたソート順序に基づいて配列の最上位の要素を返します。$top (accumulator)は、指定ソート順に従って、グループ内の最上位の要素を返します。
構文
{ $setWindowFields: { ... output: { <field>: { $top: { sortBy: { <field1>: <sort order>, <field2>: <sort order> ... }, output: <expression> } } } } }
フィールド | 必要性 | 説明 |
|---|---|---|
sortBy | 必須 |
|
出力 | 必須 | ウィンドウ内の各要素の出力を指定します。任意の式を指定できます。 |
動作
$topウィンドウ関数は、null および欠損値に対して次の動作をします。
$topは、null 値をフィルタリングで除外しません。$top欠落値を null に変換します。
例
このページの例では、 sample_mflix データセット のデータを使用します。このデータセットを自己管理型MongoDBデプロイにロードする 方法の詳細については、「 サンプル データセットをロードする 」を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
ウィンドウを介して、1 年あたりの最高評価の映画を見つける
この例では、$top をウィンドウ関数として使用して、各 映画ドキュメントの同じ年に最高評価の映画を識別します。データセットはフィルタリングされ、1980-1982 の PG 指定のファミリー映画のみを含めます。
db.movies.aggregate( [ { $match: { year: { $in: [ 1980, 1981, 1982 ] }, "imdb.rating": { $exists: true, $ne: null }, genres: "Family", rated: "PG" } }, { $setWindowFields: { partitionBy: "$year", output: { highestRatedInYear: { $top: { output: { title: "$title", rating: "$imdb.rating" }, sortBy: { "imdb.rating": -1 } }, window: { documents: [ "unbounded", "unbounded" ] } } } } }, { $project: { _id: 0, title: 1, year: 1, rating: "$imdb.rating", highestRatedInYear: 1 } }, { $limit: 10 } ] )
この例では、次のことが行われます。
$matchステージでは、1980 - の PG1982 指定のファミリー映画をフィルタリングして、小さくフォーカスされた結果セットが生成されます。$setWindowFieldsはドキュメントをyearで分割します。$topは、各パーティション内の最高評価の映画を、titleフィールドとratingフィールドを含む埋め込みドキュメントとして返します。では、出力に
$projecttitleyear、 、 、ratinghighestRatedInYearフィールドのみが含まれます。$limit出力を 10 ドキュメントに制限します。
このアプローチでは、すべての映画ドキュメントが保持され、各年の最高のパフォーマンス者への参照が含まれます。