定義
グループ内の最初の n 個の要素の集計を返します。結果は、グループ化ステージへの入力データに定義されたソート順序がある場合に限り有意義です。グループに n 個未満の要素が含まれている場合、$firstN はグループ内のすべての要素を返します。
$firstN アキュムレータは次のステージで使用可能です。
注意
曖昧さ回避
このページでは、$firstN をアキュムレータとして使用する場合について説明します。アキュムレータは、入力ドキュメントのグループ全体で、合計、最大値、最小値などの単一の集計値を返します。
$firstN は、これらの他のコンテキストでも使用できます。
$firstN (expression)、配列の先頭から指定した数の要素を返します。$firstN (window function)、これは$setWindowFieldsステージで使用され、特定のウィンドウ内のドキュメントから最初のn値を返します。
構文
{ $firstN: { input: <expression>, n: <expression> } }
オプション
フィールド | タイプ | 説明 |
|---|---|---|
| 式 | 入力グループの各ドキュメントで、 |
| 式 | The number of elements that |
動作
NULL および欠損値
$firstNは、null 値をフィルタリングで除外しません。$firstN欠落値を null に変換します。
$firstN と $topN の比較
$firstNと$topNのどちらのアキュムレータでも同様の結果が得られます。
一般に、
$groupに取り込まれるドキュメントがすでに順序付けられている場合は、$firstNを使用する必要があります。上位の
n要素をソートして選択している場合、$topNを使用すると 1 つのアキュムレータで両方のタスクを実行できます。
例
The examples on this page use the movies collection in the sample_mflix sample dataset. To learn how to load the sample dataset into your MongoDB deployment, see Import Sample Data Into Your Atlas Deployment.
1 つのジャンルに対する最初の 3 本の映画を見つける
$firstN アキュムレータを使用すると、1つのジャンル内の最初の3本の映画を検索できます。
db.movies.aggregate( [ { $match: { genres: "Horror" } }, { $sort: { year: 1 } }, { $group: { _id: "Horror", firstThreeMovies: { $firstN: { input: [ "$title", "$year" ], n: 3 } } } } ] )
以前のパイプライン:
$matchを使用して、Horrorがgenres配列に含まれている映画に絞り込み、結果をフィルターします。結果を
yearで昇順にソートします。すべての結果ドキュメントを 1 つのグループにまとめます。
を使用して
$firstNinput : ["$title", "$year"]に入力するフィールドを指定します。$firstNを使用して、Horrorジャンルでn: 3を含む最初の3つのドキュメントを返します。
複数のジャンルで最初の3本の映画を見つける
$firstN アキュムレータを使用して、各ジャンルの最初の n 個の入力フィールドを検索できます。
db.movies.aggregate( [ { $unwind: "$genres" }, { $sort: { year: 1 } }, { $group: { _id: "$genres", movies: { $firstN: { input: [ "$title", "$year" ], n: 3 } } } }, { $sort: { _id: 1 } }, { $limit: 5 } ] )
以前のパイプライン:
$unwindを使用して、genres配列内の各ジャンルに個別のドキュメントを作成します。結果を
yearで昇順にソートします。$groupを使用して結果をgenresでグループ化します。$firstNを使用して、n: 3とともに各ジャンルの最初の 3 つのドキュメントを返します。を使用して
$firstNinput : ["$title", "$year"]に入力するフィールドを指定します。可読性を向上させるため、出力を 5 ドキュメントに制限します。
グループキーに基づいて n を設定
グループ キーに基づいて、n の値をダイナミックに割り当てることができます。この例では、$cond 式は rated フィールドを使用して n の値を変更します。
db.movies.aggregate([ { $match: { rated: { $in: ["G", "PG", "PG-13", "R"] } } }, { $sort: { title: 1 } }, { $group: { _id: {"rated": "$rated"}, movies: { $firstN: { input: "$title", n: { $cond: { if: { $eq: ["$rated", "PG"] }, then: 3, else: 1 } } } } } } ] )
以前のパイプライン:
評価が
G、PG、PG-13、Rのいずれかである映画のフィルター。結果を
titleでアルファベット順にソートします。映画を
rated(映画評価) でグループ化します。$cond式を使用して、PGレートの映画には3本の映画を返し、その他のレートの映画には1本の映画を返します。
出力では、PG の評価は 3 本の映画を返します。一方、G、PG-13¡および R の評価はそれぞれ 1 本の映画を返します。