定義
$medianバージョン 7.0 で追加。
中央値、つまり50パーセンタイルの近似値がスカラー値として返されます。
は、
$medianステージの$groupアキュムレータ として、または 集計式 として使用できます。
構文
$medianの構文は次のとおりです。
{ $median: { input: <number>, method: <string> } }
コマンドフィールド
$median は、次のフィールドがあります。
フィールド | タイプ | 必要性 | 説明 |
|---|---|---|---|
| 式 | 必須 |
|
| 文字列 | 必須 |
|
動作
$medianは次の場所で使用できます。
$groupアキュムレータとしての ステージ$setWindowFieldsアキュムレータとしての ステージ$project集計式としての ステージ
$median は、アキュムレータとして次の特性があります。
ステージ内のすべてのドキュメントに対して単一の結果を計算します。
t ダイジェストアルゴリズムを使用して、近似パーセンタイル ベースのメトリクスを計算します。
近似メソッドを使用して、大規模なデータをスケーリングします。
$median 集計式として次の特性があります。
入力として配列を受け入れ
入力ドキュメントごとに個別の結果を計算
操作タイプ
$groupステージでは、 $medianはアキュムレータで、ウィンドウ内のすべてのドキュメントの 値を計算します。
$projectステージでは、 $medianは 集計式 であり、各ドキュメントの値を計算します。
$setWindowFieldsステージでは、 $medianは集計式のように各ドキュメントの結果を返しますが、結果はアキュムレータのようにドキュメントをグループ化して計算されます。
計算に関する考慮事項
$groupステージでは、 $medianは常に近似計算方法を使用します。
$projectステージでは、近似方法が指定されている場合でも、 $medianは 離散計算方法 を使用する場合があります。
$setWindowFieldsステージでは、 $medianが使用する計算方法はワークロードによって決まります。
$medianが返す計算パーセンタイルは、同じデータセットでも異なる場合があります。 これは、このアルゴリズムが近似値を計算するためです。
重複するサンプルはあいまいさを引き起こす可能性があります。 重複が多数ある場合、パーセンタイル値は実際のサンプル分布を表さない可能性があります。 すべてのサンプルが同じデータセットを考えてみましょう。 データセット内のすべての値は、任意のパーセンタイル以下になります。 「50 パーセンタイル」値は、実際にはサンプルの 0 または 100% のいずれかを表します。
配列入力
$projectステージで集計式として$medianを使用する場合は、配列を入力として使用できます。 $medianは、数値以外の配列値を無視します。
構文は次のとおりです。
{ $median: { input: [ <expression1, <expression2>, ..., <expressionN> ], method: <string> } }
ウィンドウ関数
ウィンドウ関数を使用すると、横にあるドキュメントの移動する「ウィンドウ」にわたる結果を計算できます。 各ドキュメントがパイプラインを通過する際、 $setWindowFieldsステージは次のことを行います。
現在のウィンドウ内のドキュメントセットを再計算する
セット内のすべてのドキュメントの 値を計算します
は、そのドキュメントの単一の値を返します
$setWindowFieldsステージで$medianを使用して、時系列やその他の関連データのローリング統計を計算できます。
$setWindowFieldステージで$medianを使用する場合、 input値はフィールド名である必要があります。 フィールド名ではなく配列を入力すると、操作は失敗します。
例
次の例では testScores コレクションを使用します。コレクションを作成します。
db.testScores.insertMany( [ { studentId: "2345", test01: 62, test02: 81, test03: 80 }, { studentId: "2356", test01: 60, test02: 83, test03: 79 }, { studentId: "2358", test01: 67, test02: 82, test03: 78 }, { studentId: "2367", test01: 64, test02: 72, test03: 77 }, { studentId: "2369", test01: 60, test02: 53, test03: 72 } ] )
$medianアキュムレータとして を使用
中央値を計算するアキュムレータを作成します。
db.testScores.aggregate( [ { $group: { _id: null, test01_median: { $median: { input: "$test01", method: 'approximate' } } } } ] )
出力:
{ _id: null, test01_median: 62 }
_idフィールドの値はnullであるため、 $groupはコレクション内のすべてのドキュメントを選択します。
$medianアキュムレータはtest01フィールドから入力を受け取ります。 $medianはフィールド(この例では62 )の中央値を計算します。
ステージでの の使用$median$project
$groupステージでは、 $medianはアキュムレータであり、すべてのドキュメントに対して 1 つの値を計算します。 $projectステージでは、 $medianは 集計式 であり、各ドキュメントの値を計算します。
$projectステージでは、フィールド名または配列を入力として使用できます。
db.testScores.aggregate( [ { $project: { _id: 0, studentId: 1, testMedians: { $median: { input: [ "$test01", "$test02", "$test03" ], method: 'approximate' } } } } ] )
出力:
{ studentId: '2345', testMedians: 80 }, { studentId: '2356', testMedians: 79 }, { studentId: '2358', testMedians: 78 }, { studentId: '2367', testMedians: 72 }, { studentId: '2369', testMedians: 60 }
$medianが集計式の場合、各studentIdの結果が存在します。
ステージでの の使用$median$setWindowField
ローカルデータの傾向に基づいてパーセンタイル値を演算するには、 $setWindowField集計パイプライン ステージで$medianを使用します。
この例では、スコアをフィルタリングするウィンドウを作成します。
db.testScores.aggregate( [ { $setWindowFields: { sortBy: { test01: 1 }, output: { test01_median: { $median: { input: "$test01", method: 'approximate' }, window: { range: [ -3, 3 ] } } } } }, { $project: { _id: 0, studentId: 1, test01_median: 1 } } ] )
出力:
{ studentId: '2356', test01_median: 60 }, { studentId: '2369', test01_median: 60 }, { studentId: '2345', test01_median: 60 }, { studentId: '2367', test01_median: 64 }, { studentId: '2358', test01_median: 64 }
この例では、各ドキュメントの中央値の計算には、その前後の 3 つのドキュメントのデータも含まれています。
詳細
$percentile演算子は、1 つ以上のパーセンタイル値を設定できる$median演算子のより一般的なバージョンです。
ウィンドウ関数の詳細については、 $setWindowFieldsを参照してください。