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

$minN(集計アキュムレータ)

$minN

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

注意

曖昧さ回避

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

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

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

input

式

入力値を決定するために入力ドキュメントごとに評価される式。グループごとに、最小のn個の値が保持されます。

n

式

グループごとに返される結果の最大数を指定します。n は正の整数に評価される必要があります。

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

$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には null scoreがあります。 これらの値は両方とも無視されます。

  • minimumThreeScores フィールドは、input : "$score" を使用して $minN として指定され、配列として返されます。

  • scores を持つドキュメントが 3 つしかないため、n = 4 であるにもかかわらず、$minN は最小 3 score フィールドを返します。

[
{
_id: 'G1',
minimumThreeScores: [ 1, 2, 3 ]
}
]

$minN と $bottomN の両方のアキュムレータは、グループから n 個の値を返しますが、返す値を決定する方法が異なります。

  • 比較したい値が返したい値と同じ場合は、$minN を使用します。$minN は、入力を直接比較して、最小の n 個の値を抽出します。

  • 出力とは別にソート順を定義したい場合は、$bottomN を使用します。$bottomN では、どのドキュメントが「bottom」であるかを判定するための sortBy キーと、返す値を制御するための output 式を指定できます。

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

$minN アキュムレータを使用すると、単一のジャンルで IMDb レーティングの下位 3 位を検索できます。

db.movies.aggregate( [
{
$match: { genres: "Horror" }
},
{
$group:
{
_id: "Horror",
minThreeRatings:
{
$minN:
{
input: "$imdb.rating",
n: 3
}
}
}
}
] )

サンプル パイプライン:

  • $match を使用して、Horror が genres 配列に含まれている映画に絞り込み、結果をフィルターします。

  • 一致するすべてのドキュメントを 1 つのグループにまとめるために、$group を使用します。

  • $minN の入力を input: "$imdb.rating" を使用して指定します。

  • $minN を使用して、Horror ジャンルの IMDb 評価が最も低い 3 件のエントリを n: 3 とともに返します。

$minN アキュムレータを使用して、各ジャンルで最低の n IMDb 評価を検索できます。

db.movies.aggregate( [
{
$unwind: "$genres"
},
{
$group:
{
_id: "$genres",
minThreeRatings:
{
$minN:
{
input: "$imdb.rating",
n: 3
}
}
}
},
{ $sort: { _id: 1 } },
{ $limit: 5 }
] )

サンプル パイプライン:

  • $unwind を使用して、genres 配列内の各ジャンルに個別のドキュメントを作成します。

  • genres で結果をグループ化するために $group を使用します。

  • $minN を使用して、n: 3 とともに各ジャンルのIMDb 評価が最も低いエントリーを3件返します。

  • $minN の入力を input: "$imdb.rating" を使用して指定します。

  • ジャンル別にアルファベット順で結果をソートするために $sort を使用します。

  • 可読性を向上させるため、出力を 5 ドキュメントに制限します。

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 件のエントリを返します。

このページを評価