AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

$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 つのアキュムレータで両方のタスクを実行できます。

このページの例では、movies sample_mflixサンプルデータセットの コレクションを使用します。サンプルデータセットを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
}
}
}
}
] )

先行するパイプライン:

  • $matchHorrorgenresを使用して、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 }
] )

先行するパイプライン:

  • $matchyearを使用して、 が整数である映画をフィルタリングします。

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

  • 結果を 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 映画を返します。

このページを評価