定義
$maxN アキュムレータは次のステージで使用可能です。
注意
$maxN のその他の使用方法
このページでは、$maxN をアキュムレータとして使用する場合について説明します。アキュムレータは、入力ドキュメントのグループ全体で、合計、最大値、最小値などのような集計値を返します。
$maxN は、これらの他のコンテキストでも使用できます。
$maxN (expression)は、配列内の最大のn個の値を返します。$maxN (window function)は、$setWindowFieldsステージで使用され、特定のウィンドウのドキュメントから最大のn値を返します。
構文
{ $maxN: { input: <expression>, n: <expression> } }
フィールド | タイプ | 説明 |
|---|---|---|
| 式 | グループ内の各要素について評価される式。 |
| 式 | The number of elements that |
動作
結果の型
$maxN が異なる型の値を比較する場合、型の順序はBSON 比較順序に従います。
NULL および欠損値
$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 つのみです。Magnoliaratingがありません。Dogmaのratingが null です。両方の値はフィルターされて除外されます。3 ドキュメントのみが有効な評価を持っているため、
$maxNは 3 個の値をn = 4であっても返します。
$maxN と $topN アキュムレータの比較
$maxN または $topN を使用して、グループから最もランクの高い n 要素を返すことができます。それらの間の選択は、入力ドキュメントが既にソートされているかどうかによって異なります。
入力ドキュメントが既にソートされている場合は、
$maxNを使用して最大のn値を返します。上位
n要素のソートと選択を同時に行う必要がある場合は、1 つのアキュムレータで両方を実現するために、$topNを使用します。
例
このページの例では、sample_mflix データセット のデータを使用しています。自己管理型 MongoDB 配置にこのデータセットをロードする方法の詳細については、「サンプル データセットのロード」を参照してください。サンプル データベースに何らかの変更を加えた場合は、今ページの例を実行するには、データベースを削除して再作成する必要がある可能性があります。
単一年度の評価の高い上位 3 作の映画を検索する
$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 つの最高評価を返します。
複数年間の最高評価の上位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 } } ] )
以前のパイプライン:
グループキーに基づいて n を設定
グループ キーに基づいて、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 つの評価を返します。