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

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

$maxN

グループ内の最大値である n 要素の集計値を返します。グループに n 個未満の要素が含まれている場合、$maxN はグループ内のすべての要素を返します。

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

注意

$maxN のその他の使用方法

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

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

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

input

式

グループ内の各要素について評価される式。$maxN は最大 n 値を保持します。

n

式

The number of elements that $maxN returns from the group. For an example of setting n dynamically, see Set n Based on the Group Key.

$maxN が異なる型の値を比較する場合、型の順序はBSON 比較順序に従います。

$maxN は null 値と欠損値を除外します。

次の集計では、$maxN が null 値と欠落値をどのように取り扱うかを示します。

db.aggregate( [
{
$documents: [
{ title: "Fight Club", genre: "Drama", rating: 8.9 },
{ title: "The Matrix", genre: "Drama", rating: 8.7 },
{ title: "The Green Mile", genre: "Drama", rating: 8.5 },
{ title: "Magnolia", genre: "Drama" },
{ title: "Dogma", genre: "Drama", rating: null }
]
},
{
$group: {
_id: "$genre",
topFourRatings: {
$maxN: {
input: "$rating",
n: 4
}
}
}
}
] )
[
{
_id: 'Drama',
topFourRatings: [ 8.9, 8.7, 8.5 ]
}
]

この例では、次のことが行われます。

  • $documents 映画の評価を含むリテラルドキュメントを作成します。

  • $groupはドキュメントをgenreでグループ化します。 この例ではgenre 、 Dramaは 1 つのみです。

  • Magnolia rating がありません。Dogma の rating が null です。両方の値はフィルターされて除外されます。

  • 3 ドキュメントのみが有効な評価を持っているため、$maxN は 3 個の値を n = 4 であっても返します。

$maxN または $topN を使用して、グループから最もランクの高い n 要素を返すことができます。それらの間の選択は、入力ドキュメントが既にソートされているかどうかによって異なります。

  • 入力ドキュメントが既にソートされている場合は、$maxN を使用して最大の n 値を返します。

  • 上位 n 要素のソートと選択を同時に行う必要がある場合は、1 つのアキュムレータで両方を実現するために、$topN を使用します。

このページの例では、sample_mflix データセット のデータを使用しています。自己管理型 MongoDB 配置にこのデータセットをロードする方法の詳細については、「サンプル データセットのロード」を参照してください。サンプル データベースに何らかの変更を加えた場合は、今ページの例を実行するには、データベースを削除して再作成する必要がある可能性があります。

$maxN アキュムレータを使用すると、1 年間に公開された映画の IMDb 評価の上位 3 位を検索できます。

db.movies.aggregate( [
{
$match: {
year: 1999,
"imdb.rating": { $exists: true }
}
},
{
$group: {
_id: 1999,
topThreeRatings: {
$maxN: {
input: "$imdb.rating",
n: 3
}
}
}
}
] )

以前のパイプライン:

  • $match を使用して、1999年に公開された映画のうちimdb.ratingフィールドを持つものをフィルターします。

  • すべての一致するドキュメントを _id: 1999 で 1 つのグループにまとめます。

  • $maxN の input として "$imdb.rating" を指定します。

  • $maxN を使用して、n: 3 で 3 つの最高評価を返します。

$maxN アキュムレータを使用して、複数年間の各年の評価が最も高い映画を3本検索できます。

db.movies.aggregate( [
{
$match: {
year: { $in: [ 1999, 2000, 2001 ] },
"imdb.rating": { $exists: true }
}
},
{
$group: {
_id: "$year",
topThreeRatings: {
$maxN: {
input: "$imdb.rating",
n: 3
}
}
}
},
{ $sort: { _id: 1 } }
] )

以前のパイプライン:

  • $match を使用して、1999年、2000年、2001年に公開され、imdb.ratingフィールドを持つ映画をフィルターします。

  • $group を使用して、映画を year でグループ化します。

  • $maxN の input として "$imdb.rating" を指定します。

  • $maxN を使用して、n: 3 とともに年間の上位 3 件の評価を返します。

  • 結果を年で昇順に並べ替えます。

グループ キーに基づいて、n の値をダイナミックに割り当てることができます。この例では、$cond 式は year フィールドを使用して n の値を変更します。

db.movies.aggregate( [
{
$match: {
year: { $in: [ 1999, 2000, 2001 ] },
"imdb.rating": { $exists: true }
}
},
{
$group: {
_id: { year: "$year" },
topRatedMovies: {
$maxN: {
input: "$imdb.rating",
n: { $cond: {
if: { $eq: [ "$year", 2001 ] },
then: 3,
else: 1
} }
}
}
}
},
{ $sort: { "_id.year": 1 } }
] )

以前のパイプライン:

  • 1999、2000、2001に公開された、imdb.ratingフィールドを持つ映画のフィルター

  • year で映画をグループ化します。

  • $cond 式を使用して、2001 年の 3 評価を返し、その他の年の 1 評価を返します。

出力では、2001 は 3 つの評価を返します。一方、1999 と 2000 はそれぞれ 1 つの評価を返します。

このページを評価