定義
$maxNアキュムレータは、次のステージで使用できます。
注意
$maxN のその他の用途
このページでは、アキュムレータとして使用する場合の$maxN について説明します。アキュムレータは、入力ドキュメントのグループ全体の合計、最大、最小などの集計値を返します。
次の他のコンテキストでは $maxN を使用することもできます。
$maxN (expression)は、配列から最大のn値を返します。$maxN (window function)は、特定のウィンドウ内のドキュメントから最大の$setWindowFieldsn値を返すために ステージで使用されます。
構文
{ $maxN: { input: <expression>, n: <expression> } }
フィールド | タイプ | 説明 |
|---|---|---|
| 式 | グループ内の各要素に対して評価された式。 |
| 式 |
|
動作
結果の型
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 つのみです。Magnoliaには null のratingがあり、Dogmaには null のratingがあります。両方の値がフィルタリングで除外されます。有効な評価は 3 ドキュメントのみにあるため、
n = 4であっても、$maxNは 3 値を返します。
$maxN と $topN アキュムレータの比較
グループから最上位の 要素を返すには、 $maxNまたは$topN を使用します。これらの選択は、入力ドキュメントがすでにソートされているかどうかによって異なります。n
入力ドキュメントがすでにソートされている場合は、
$maxNを使用して最大のn値を返します。上位の
n要素を同時にソートして選択する必要がある場合は、 を使用して 1$topNつのアキュムレータで両方を実行します。
例
このページの例では、 sample_mflix データセット のデータを使用します。このデータセットを自己管理型MongoDBデプロイにロードする 方法の詳細については、「 サンプル データセットをロードする 」を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
1 年間で最高評価の 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 } } } } ] )
先行するパイプライン:
$match1999imdb.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 } } ] )
先行するパイプライン:
グループ キーに基づいて 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でグループ化します。式を使用して、
$cond3年は 評価を返し、その他すべての年は2001評価を返します。1
出力では、2001 はそれぞれ 3 つの評価を返し、1999 と 2000 はそれぞれ 1 つの評価を返します。