$minN(集計アキュムレータ)
定義
構文
{ $minN: { input: <expression>, n: <expression> } }
input
は、$minN
への入力である 式 を指定します。 グループ内の各要素に対して評価が行われ、$minN
は最小のn
値を保持します。n
はグループあたりの結果数を制限し、n
は定数であるか、$group
の_id
値に依存する正の整数式である必要があります。
動作
結果の型
$minN
は、BSON 比較の順序に従って入力データを比較し、適切な出力型を決定します。入力データに複数のデータ型が含まれている場合、$minN
の出力型は比較順序で最低となります。
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 つしかないため、minN
はn = 4
であっても少なくとも 3 つのscore
フィールドを返します。
[ { _id: 'G1', minimumThreeScores: [ 1, 2, 3 ] } ]
アキュムレータと アキュムレータの比較$minN
$bottomN
$minN
と$bottomN
のどちらのアキュムレータでも同様の結果が得られます。
一般に、
$minN
には、特定のソート順序で最小値が見つからないという利点があります。n
ドキュメントの最小値を確認するには、$minN
を使用します。特定の並べ替え順序を保証する必要がある場合は、
$bottomN
を使用します。出力値でソートしない場合は、
$bottomN
を使用します。
制限事項
ウィンドウ関数と集計式のサポート
$minN
をアキュムレータとして使用できます。
メモリ制限に関する考慮事項
$minN
を呼び出す集計パイプラインには100 MB の制限が適用されます。 個々のグループでこの制限を超えると、集計はエラーで失敗します。
例
以下のドキュメントを持つgamescores
コレクションを考えてみましょう。
db.gamescores.insertMany([ { playerId: "PlayerA", gameId: "G1", score: 31 }, { playerId: "PlayerB", gameId: "G1", score: 33 }, { playerId: "PlayerC", gameId: "G1", score: 99 }, { playerId: "PlayerD", gameId: "G1", score: 1 }, { playerId: "PlayerA", gameId: "G2", score: 10 }, { playerId: "PlayerB", gameId: "G2", score: 14 }, { playerId: "PlayerC", gameId: "G2", score: 66 }, { playerId: "PlayerD", gameId: "G2", score: 80 } ])
1 回のプレイに最小限必要な 3Scores
つの を見つける
$minN
アキュムレータを使用して、1 一致の最小スコア 3 を見つけることができます。
db.gamescores.aggregate( [ { $match : { gameId : "G1" } }, { $group: { _id: "$gameId", minScores: { $minN: { input: ["$score","$playerId"], n:3 } } } } ] )
サンプル パイプライン:
$match
を使用して結果を単一のgameId
でフィルタリングします。 この場合は、G1
ます。$group
を使用して結果をgameId
でグループ化します。 この場合は、G1
ます。を使用して
$minN
input : ["$score","$playerId"]
に入力するフィールドを指定します。$minN
を使用して、G1
とn : 3
の最初の 3 つのスコア要素を返します。
この操作は次の結果を返します。
[ { _id: 'G1', minScores: [ [ 1, 'PlayerD' ], [ 31, 'PlayerA' ], [ 33, 'PlayerB' ] ] } ]
複数のゲームにまたがって最小 3 つのドキュメントを検索
$minN
アキュムレータを使用して、各ゲームの最小n
スコアを見つけることができます。
db.gamescores.aggregate( [ { $group: { _id: "$gameId", minScores: { $minN: { input: ["$score","$playerId"], n: 3 } } } } ] )
サンプル パイプライン:
$group
を使用して結果をgameId
でグループ化します。$minN
を使用して、n: 3
を持つゲームごとの最小 3 つのスコア要素を返します。を使用して
$minN
input: ["$score","$playerId"]
に入力するフィールドを指定します。
この操作は次の結果を返します。
[ { _id: 'G2', minScores: [ [ 10, 'PlayerA' ], [ 14, 'PlayerB' ], [ 66, 'PlayerC' ] ] }, { _id: 'G1', minScores: [ [ 1, 'PlayerD' ], [ 31, 'PlayerA' ], [ 33, 'PlayerB' ] ] } ]
のグループキーに基づいて を計算n
$group
また、 n
の値を動的に割り当てることもできます。 この例では、 $cond
式はgameId
フィールドで使用されています。
db.gamescores.aggregate([ { $group: { _id: {"gameId": "$gameId"}, gamescores: { $minN: { input: ["$score","$playerId"], n: { $cond: { if: {$eq: ["$gameId","G2"] }, then: 1, else: 3 } } } } } } ] )
サンプル パイプライン:
$group
を使用して結果をgameId
でグループ化します。input : ["$score","$playerId"]
を使用して$minN
に入力するフィールドを指定します。gameId
がG2
の場合、n
は 1、それ以外の場合、n
は 3 になります。
この操作は次の結果を返します。
[ { _id: { gameId: 'G2' }, gamescores: [ [ 10, 'PlayerA' ] ] }, { _id: { gameId: 'G1' }, gamescores: [ [ 1, 'PlayerD' ], [ 31, 'PlayerA' ], [ 33, 'PlayerB' ] ] } ]