定義
グループ内の最初の n 要素の集計を返します。結果は、グループ化ステージへの入力データに定義されたソート順序がある場合にのみ意味があります。グループに含まれる要素が n 未満の場合、$firstN はグループ内のすべての要素を返します。
$firstNアキュムレータは、次のステージで使用できます。
注意
曖昧さ回避
このページでは、アキュムレータとして使用する場合の$firstN について説明します。アキュムレータは、入力ドキュメントのグループ全体の合計、最大、または最小などの単一の集計値を返します。
次の他のコンテキストでは $firstN を使用することもできます。
$firstN (expression)は、配列の先頭から指定された数の要素を返します。$firstN (window function)。これは特定のウィンドウ内のドキュメントから最初の$setWindowFieldsn値を返すために ステージで使用されます。
構文
{ $firstN: { input: <expression>, n: <expression> } }
オプション
フィールド | タイプ | 説明 |
|---|---|---|
| 式 |
|
| 式 |
|
動作
NULL および欠損値
$firstNは、null 値をフィルタリングで除外しません。$firstN欠落値を null に変換します。
$firstN と $topN の比較
$firstN$topNと のどちらのアキュムレータでも同様の結果が得られます。
一般に、
$groupに取り込まれるドキュメントがすでに順序付けられている場合は、$firstNを使用する必要があります。上位の
n要素をソートして選択している場合、$topNを使用すると 1 つのアキュムレータで両方のタスクを実行できます。
例
このページの例では、movies sample_mflixサンプルデータセットの コレクションを使用します。サンプルデータセットをMongoDBデプロイにロードする 方法については、「 Atlas デプロイへのサンプル データのインポート 」を参照してください。
1 つのジャンルの最初の 3 つの映画を検索
$firstNアキュムレータを使用して、1 つのジャンル内の最初の 3 つの映画を見つけることができます。
db.movies.aggregate( [ { $match: { genres: "Horror" } }, { $sort: { year: 1 } }, { $group: { _id: "Horror", firstThreeMovies: { $firstN: { input: [ "$title", "$year" ], n: 3 } } } } ] )
先行するパイプライン:
$matchHorrorgenresを使用して、 が 配列に含まれる映画に結果をフィルタリングします。結果を
yearの昇順でソートします。結果のドキュメントをすべて 1 つのグループにグループ化します。
を使用して
$firstNinput : ["$title", "$year"]に入力するフィールドを指定します。$firstNを使用して、n: 3を持つHorrorジャンルの最初の 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 } ] )
先行するパイプライン:
$unwindgenresを使用して、 配列の各ジャンルに個別のドキュメントを作成します。結果を
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 映画を返します。