AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

$lastN(アキュムレータ演算子)

$lastN

グループ内の最後の n 個の要素に対して指定された式を評価した結果を返します。結果は、グループ化ステージへの入力データに定義されたソート順序がある場合に限り有意義です。グループに n 個未満の要素が含まれている場合、$lastN はグループ内のすべての要素を返します。

$lastN アキュムレータは次のステージで使用可能です。

注意

曖昧さ回避

このページでは、$lastN をアキュムレータとして使用する場合について説明します。アキュムレータは、入力ドキュメントのグループ全体で、合計、最大値、最小値などのような集計値を返します。

$lastN は、これらの他のコンテキストでも使用できます。

{ $lastN: { input: <expression>, n: <expression> }}
フィールド
タイプ
説明

input

式

input 式は入力グループの各ドキュメントで評価され、最後の n 件の結果が保存されます。

n

式

$lastN がグループから返す要素の数。n をグループ キーに基づいて動的に設定する例については、グループ キーに基づいて n を設定するを参照してください。

  • $lastN は、null 値をフィルタリングで除外しません。

  • $lastN 欠落値を null に変換します。

$lastN と $bottomN を使用して、グループから最後の n 要素を返すことができます。ただし、それぞれを使用するタイミングの違いは、入力ドキュメントが既にソートされているかどうかによって異なります。

  • $groupに取り込まれるドキュメントがすでに順序付けられている場合は、 $lastNを使用する必要があります。

  • 最下位のn要素をソートして選択している場合、 $bottomNを使用すると 1 つのアキュムレータで両方のタスクを実行できます。

このページの例では、sample_mflix サンプル データセットの movies コレクションを使用します。サンプル データセットを MongoDB 配置にロードする方法を学ぶには、「Atlas 配置へのサンプル データのインポート」を参照してください。

$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 } } } }] )

以前のパイプライン:

  • $match を使用して、結果をフィルターして、Horror が genres 配列に含まれ、year が整数である映画に絞り込みます。

  • year で結果を昇順にソートし、同順の場合の決定条件として title を字書順にソートします。

  • すべての結果ドキュメントを 1 つのグループにまとめます。

  • を使用して$lastN input : ["$title", "$year"]に入力するフィールドを指定します。

  • $lastN を使用して、n: 3 を持つ Horror ジャンルの最後の 3 つのドキュメント (年の昇順でソートされ、title をタイブレーカーとして) を返します。

$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 }] )

以前のパイプライン:

  • $match を使用して、year が整数である映画をフィルターします。

  • $unwind を使用して、genres 配列内の各ジャンルに個別のドキュメントを作成します。

  • 結果を year で昇順にソートし、その後 title でアルファベット順にソートします。

  • $groupを使用して結果をgenresでグループ化します。

  • $lastN を使用して、n: 3 を含む各ジャンルについて、最新の 3 つのドキュメント (年の昇順で、title をタイブレーカーとして) を返します。

  • を使用して$lastN input : ["$title", "$year"]に入力するフィールドを指定します。

  • 可読性を向上させるため、出力を 5 ドキュメントに制限します。

グループ キーに基づいて、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 本の映画を返します。

このページを評価