定義
グループ内の最小の n 個の値を返します。グループに n 個未満の要素が含まれている場合、$minN はグループ内のすべての要素を返します。
注意
曖昧さ回避
このページでは、$minN をアキュムレータとして使用する場合について説明します。アキュムレータは、入力ドキュメントのグループ全体で、合計、最大値、最小値などのような集計値を返します。
$minN は、これらの他のコンテキストでも使用できます。
$minN (expression)は、配列内のn個の最小値を返します。$minN (window function)は、$setWindowFieldsステージで使用され、特定のウィンドウのドキュメントから最小値nを返します。
構文
{ $minN: { input: <expression>, n: <expression> } }
フィールド | タイプ | 説明 |
|---|---|---|
| 式 | 入力値を決定するために入力ドキュメントごとに評価される式。グループごとに、最小の |
| 式 | グループごとに返される結果の最大数を指定します。 |
動作
結果の型
$minN が異なる型の値を比較する場合、型の順序はBSON 比較順序に従います。
NULL および欠損値
$minN は null 値と欠損値を除外します。
次のグループから最小値 n を返す集計を考えてみましょう。
db.aggregate( [ { $documents: [ { playerId: "PlayerA", gameId: "G1", score: 1 }, { playerId: "PlayerB", gameId: "G1", score: 2 }, { playerId: "PlayerC", gameId: "G1", score: 3 }, { playerId: "PlayerD", gameId: "G1" }, { playerId: "PlayerE", gameId: "G1", score: null } ] }, { $group: { _id: "$gameId", minimumThreeScores: { $minN: { input: "$score", n: 4 } } } } ] )
この例では、次のことが行われます。
$documentsは、プレイヤーのスコアを含むリテラル ドキュメントを作成します。$groupはドキュメントをgameIdでグループ化します。 この例ではgameId、G1は 1 つのみです。PlayerDはスコアが欠落しており、PlayerEには nullscoreがあります。 これらの値は両方とも無視されます。minimumThreeScoresフィールドは、input : "$score"を使用して$minNとして指定され、配列として返されます。scoresを持つドキュメントが 3 つしかないため、n = 4であるにもかかわらず、$minNは最小 3scoreフィールドを返します。
[ { _id: 'G1', minimumThreeScores: [ 1, 2, 3 ] } ]
$minN と $bottomN アキュムレータの比較
$minN と $bottomN の両方のアキュムレータは、グループから n 個の値を返しますが、返す値を決定する方法が異なります。
比較したい値が返したい値と同じ場合は、
$minNを使用します。$minNは、入力を直接比較して、最小のn個の値を抽出します。出力とは別にソート順を定義したい場合は、
$bottomNを使用します。$bottomNでは、どのドキュメントが「bottom」であるかを判定するためのsortByキーと、返す値を制御するためのoutput式を指定できます。
例
このページの例では、sample_mflix データセット のデータを使用しています。自己管理型 MongoDB 配置にこのデータセットをロードする方法の詳細については、「サンプル データセットのロード」を参照してください。サンプル データベースに何らかの変更を加えた場合は、今ページの例を実行するには、データベースを削除して再作成する必要がある可能性があります。
1 つのジャンルにおける最小 3 つの評価を見つける
$minN アキュムレータを使用すると、単一のジャンルで IMDb レーティングの下位 3 位を検索できます。
db.movies.aggregate( [ { $match: { genres: "Horror" } }, { $group: { _id: "Horror", minThreeRatings: { $minN: { input: "$imdb.rating", n: 3 } } } } ] )
サンプル パイプライン:
複数のジャンルにおける最小の3つの評価を検出する
$minN アキュムレータを使用して、各ジャンルで最低の n IMDb 評価を検索できます。
db.movies.aggregate( [ { $unwind: "$genres" }, { $group: { _id: "$genres", minThreeRatings: { $minN: { input: "$imdb.rating", n: 3 } } } }, { $sort: { _id: 1 } }, { $limit: 5 } ] )
サンプル パイプライン:
グループキーに基づいて n を動的に設定する
n の値をダイナミックに割り当てることができます。この例では、$cond 式が rated フィールドで使用されます。
db.movies.aggregate( [ { $match: { rated: { $in: [ "G", "PG", "PG-13", "R" ] } } }, { $group: { _id: { "rated": "$rated" }, minMovies: { $minN: { input: "$imdb.rating", n: { $cond: { if: { $eq: [ "$rated", "R" ] }, then: 3, else: 1 } } } } } } ] )
サンプル パイプライン:
評価が
G、PG、PG-13、Rのいずれかである映画のフィルター。映画を
rated(コンテンツレーティング) 別にグループ化します。$minNの入力をinput: "$imdb.rating"を使用して指定します。$cond式を使用して、R評価の映画に対して3件の最小エントリを返し、その他のすべての評価に対して1件の最小エントリを返します。
出力では、R の評価は 3 件のエントリを返します。一方、G、PG¡および PG-13 の評価はそれぞれ 1 件のエントリを返します。