定義
グループ内の最小の n 値を返します。グループに含まれる要素が n 未満の場合、$minN はグループ内のすべての要素を返します。
注意
曖昧さ回避
このページでは、アキュムレータとして使用する場合の$minN について説明します。アキュムレータは、入力ドキュメントのグループ全体の合計、最大、最小などの集計値を返します。
次の他のコンテキストでは $minN を使用することもできます。
$minN (expression)は、配列内のnの最小値を返します。$minN (window function)は、特定のウィンドウ内のドキュメントから最小の$setWindowFieldsn値を返すために ステージで使用されます。
構文
{ $minN: { input: <expression>, n: <expression> } }
フィールド | タイプ | 説明 |
|---|---|---|
| 式 | 入力値を決定するために各入力ドキュメントに対して評価される式。このような最小の |
| 式 | グループごとに返される結果の最大数を決定します。 |
動作
結果の型
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フィールドは$minNとinput : "$score"として指定され、配列として返されます。scoresを持つ 3 ドキュメントしかないため、n = 4であっても、$minNは最小の 3scoreフィールドを返します。
[ { _id: 'G1', minimumThreeScores: [ 1, 2, 3 ] } ]
$minN アキュムレータと $bottomN アキュムレータの比較
$minN$bottomNアキュムレータとn アキュムレータはどちらもグループから 値を返しますが、返される値の決定方法は異なります。
比較する値が返したい値と同じである場合は、
$minNを使用します。$minNは入力を直接比較してnの最小値を選択します。$bottomN出力とは別に並べ替え順序を定義する場合は、 を使用します。 では、 キーを指定して、どのドキュメントが「最下位」であるかを判断できます。返す値を制御するための$bottomNsortByoutput式と 。
例
このページの例では、 sample_mflix データセット のデータを使用します。このデータセットを自己管理型MongoDBデプロイにロードする 方法の詳細については、「 サンプル データセットをロードする 」を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
1 つのジャンルの最小 3 つの評価を見つける
$minNアキュムレータを使用すると、1 つのジャンルの最低 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(コンテンツ評価)でグループ化します。input: "$imdb.rating"を使用して$minNの入力を指定します。$cond式を使用して、R評価の映画の3最小エントリと その他のすべての評価の1最小エントリを返します。
出力では、R 評価では 3 エントリが返され、G、PG、PG-13 の評価ではそれぞれ 1 エントリが返されます。