定義
グループ内の最後の n 要素に対して指定された式を評価した結果を返します。結果は、グループ化ステージへの入力データに定義されたソート順序がある場合にのみ意味があります。グループに含まれる要素が n 未満の場合、$lastN はグループ内のすべての要素を返します。
$lastNアキュムレータは、次のステージで使用できます。
注意
曖昧さ回避
このページでは、アキュムレータとして使用する場合の$lastN について説明します。アキュムレータは、入力ドキュメントのグループ全体の合計、最大、最小などの集計値を返します。
次の他のコンテキストでは $lastN を使用することもできます。
$lastN (expression)は、配列の末尾から指定された数の要素を返します。$lastN (window function)。これは特定のウィンドウ内のドキュメントから最後の$setWindowFieldsn値を返すために ステージで使用されます。
構文
{ $lastN: { input: <expression>, n: <expression> } }
オプション
フィールド | タイプ | 説明 |
|---|---|---|
| 式 |
|
| 式 |
|
動作
NULL および欠損値
$lastNは、null 値をフィルタリングで除外しません。$lastN欠落値を null に変換します。
$lastN と $bottomN の比較
$lastN$bottomNとn を使用すると、グループから最後の 要素を返すことができます。ただし、それぞれを使用するタイミングの違いは、入力ドキュメントがすでにソートされているかどうかによって異なります。
$groupに取り込まれるドキュメントがすでに順序付けられている場合は、$lastNを使用する必要があります。最下位の
n要素をソートして選択している場合、$bottomNを使用すると 1 つのアキュムレータで両方のタスクを実行できます。
例
このページの例では、movies sample_mflixサンプルデータセットの コレクションを使用します。サンプルデータセットをMongoDBデプロイにロードする 方法については、「 Atlas デプロイへのサンプル データのインポート 」を参照してください。
1 つのジャンルの最後の 3 つの映画を検索
$lastNアキュムレータを使用して、特定のジャンルで最新にリリースされた映画を見つけることができます。
db.movies.aggregate( [ { $match: { genres: "Horror", year: { $type: "int" } } }, { $sort: { year: 1, title: 1 } }, { $group: { _id: "Horror", lastThreeMovies: { $lastN: { input: [ "$title", "$year" ], n: 3 } } } } ] )
先行するパイプライン:
$matchHorrorgenresを使用して、yearが 配列に含まれており、かつ が整数である映画に結果をフィルタリングします。結果を
yearで昇順にソートし、次にtitleでアルファベット順にソートします。結果のドキュメントをすべて 1 つのグループにグループ化します。
を使用して
$lastNinput : ["$title", "$year"]に入力するフィールドを指定します。$lastNを使用して、n: 3を持つHorrorジャンルの最後の 3 つのドキュメント(年の昇順でソートされ、titleがタイブレークとして)を返します。
複数のジャンルにまたがる最後の 3 つの映画を検索
$lastNアキュムレータを使用して、各ジャンルの最後の n 入力フィールドを見つけることができます。
db.movies.aggregate( [ { $match: { year: { $type: "int" } } }, { $unwind: "$genres" }, { $sort: { year: 1, title: 1 } }, { $group: { _id: "$genres", movies: { $lastN: { input: [ "$title", "$year" ], n: 3 } } } }, { $sort: { _id: 1 } }, { $limit: 5 } ] )
先行するパイプライン:
$matchyearを使用して、 が整数である映画をフィルタリングします。$unwindgenresを使用して、 配列の各ジャンルに個別のドキュメントを作成します。結果を
yearで昇順にソートし、次にtitleでアルファベット順にソートします。$groupを使用して結果をgenresでグループ化します。$lastNを使用して、n: 3を持つ各ジャンルの最後の 3 つのドキュメント(年の昇順、titleはタイブレークとして)を返します。を使用して
$lastNinput : ["$title", "$year"]に入力するフィールドを指定します。読みやすくするために出力を 5 つのドキュメントに制限します。
グループ キーに基づいて n を設定
nグループキーに基づいて、 の値を動的に割り当てることができます。この例では 、$cond 式はrated フィールドを使用して の値を変更します。n
db.movies.aggregate( [ { $match: { rated: { $in: [ "G", "PG", "PG-13", "R" ] }, year: { $type: "int" }, title: { $regex: "^[A-Za-z0-9]" } } }, { $sort: { title: 1 } }, { $group: { _id: { rated: "$rated" }, movies: { $lastN: { input: "$title", n: { $cond: { if: { $eq: ["$rated", "PG"] }, then: 3, else: 1 } } } } } }, { $sort: { "_id.rated": 1 } } ] )
先行するパイプライン:
コンテンツ評価が
G、PG、PG-13、またはRの映画をフィルタリングします。yearは整数で、titleは英数字で始まる。結果を
titleでアルファベット順にソートします。映画を
rated(コンテンツ評価)でグループ化します。$cond式を使用して、PG評価の映画では3映画を返し、その他のすべての評価では1映画を返します。
出力では、PG の評価は 3 の映画を返し、G、PG-13、R の評価はそれぞれ 1 映画を返します。