定義
指定ソート順に従って、特定のウィンドウ内の上位 個の n 要素を返します。
注意
$topN のその他の用途
このページでは、ウィンドウ関数として使用する場合の$topN について説明します。
$topN (accumulator)また、n を使用することもできます。これは、指定ソート順に従って、グループ内の上位 要素を返します。
構文
{ $setWindowFields: { ... output: { <field>: { $topN: { n: <expression>, output: <expression>, sortBy: { <field1>: <sort order>, <field2>: <sort order>, ... } } } } } }
オプション
フィールド | 必要性 | 説明 |
|---|---|---|
| 必須 | 返される結果の数。正の整数値に解決される必要があります。 ウィンドウに含まれる要素が |
| 必須 | ウィンドウ内の各ドキュメントの出力を決定します。任意の式を指定できます。 |
| 必須 |
|
動作
NULL および欠損値
$topNは、null 値をフィルタリングで除外しません。$topN欠落値を null に変換します。
例
このページの例では、 sample_mflix データセット のデータを使用します。このデータセットを自己管理型MongoDBデプロイにロードする 方法の詳細については、「 サンプル データセットをロードする 」を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
ウィンドウ内で最高評価の 3 つの映画を検索
この例では、$topN の$setWindowFields を使用して、同じ年に公開された最高評価の 3 つの映画を含む各映画を返します。
db.movies.aggregate( [ { $match: { year: { $in: [ 1999, 2001 ] }, "imdb.rating": { $gte: 8.5 } } }, { $setWindowFields: { partitionBy: "$year", output: { topThreeRatedInYear: { $topN: { sortBy: { "imdb.rating": -1, title: 1 }, output: { rating: "$imdb.rating", title: "$title" }, n: 3 }, window: { documents: [ "unbounded", "unbounded" ] } } } } }, { $project: { _id: 0, title: 1, year: 1, "imdb.rating": 1, topThreeRatedInYear: 1 } }, { $sort: { year: 1, "imdb.rating": -1 } } ] )
前の例では、次のようになります。
は、 または
$matchにリリースされ、19992001IMDb 評価が8.5以上の映画をフィルタリングします。$setWindowFieldsはドキュメントをyearで分割します。window: { documents: [ "unbounded", "unbounded" ] }$topNは年ごとのパーティション全体にまたがるため、最高評価の 3 つの映画を決定する際には、その年のすべてのドキュメントを考慮します。$topNは、sortBy: { "imdb.rating": -1, title: 1 }を使用して IMDb スコアで映画をランク付けし、titleをタイブレークとして使用します。同じ年のすべてのドキュメントには同じtopThreeRatedInYear値が与えられます。$projectは、ウィンドウ関数の結果を強調表示するために不要なフィールドを削除します。$sort出力を 年が昇順でソートされ、評価が降順にソートされます。