定義
特定のウィンドウからの値の平均を返します。
注意
曖昧さ回避
このページでは、ウィンドウ関数として使用する場合の$avg について説明します。
次の他のコンテキストでは $avg を使用することもできます。
$avg (accumulator)は、入力ドキュメントの変数に基づいて単一の集計値を返します。$avg (expression)は、配列内の数値要素の平均を返します。
構文
{ $setWindowFields: { ... output: { <field>: { $avg: <expression> } } } }
動作
結果の型
デフォルトの戻り値の型は double です。少なくとも 1 つの入力値が小数の場合、戻り値の型は小数になります。
数値以外の値または欠損値
$avg は欠落値を含む数値以外の値を無視します。すべての入力値が数値以外の場合、$avg は null を返します。
例
カリフォルニア州(CA)とワシントン州(WA)のケーキ販売を含む cakeSales コレクションを作成します。
db.cakeSales.insertMany( [ { _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"), state: "CA", price: 13, quantity: 120 }, { _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"), state: "WA", price: 14, quantity: 140 }, { _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"), state: "CA", price: 12, quantity: 145 }, { _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"), state: "WA", price: 13, quantity: 104 }, { _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"), state: "CA", price: 41, quantity: 162 }, { _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"), state: "WA", price: 43, quantity: 134 } ] )
この例では、$avgウィンドウ関数を使用して、各 state のケーキ売上 quantity の移動平均を出力します。各州について、注文の平均数量と以前のすべての注文を含む各ドキュメントにフィールドを追加します。
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { averageQuantityForState: { $avg: "$quantity", window: { documents: [ "unbounded", "current" ] } } } } } ] )
CA と WA の移動平均 quantity は averageQuantityForStateフィールドに表示されます。
[ { _id: 4, type: 'strawberry', orderDate: ISODate('2019-05-18T16:09:01.000Z'), state: 'CA', price: 41, quantity: 162, averageQuantityForState: 162 }, { _id: 0, type: 'chocolate', orderDate: ISODate('2020-05-18T14:10:30.000Z'), state: 'CA', price: 13, quantity: 120, averageQuantityForState: 141 }, { _id: 2, type: 'vanilla', orderDate: ISODate('2021-01-11T06:31:15.000Z'), state: 'CA', price: 12, quantity: 145, averageQuantityForState: 142.33333333333334 }, { _id: 5, type: 'strawberry', orderDate: ISODate('2019-01-08T06:12:03.000Z'), state: 'WA', price: 43, quantity: 134, averageQuantityForState: 134 }, { _id: 3, type: 'vanilla', orderDate: ISODate('2020-02-08T13:13:23.000Z'), state: 'WA', price: 13, quantity: 104, averageQuantityForState: 119 }, { _id: 1, type: 'chocolate', orderDate: ISODate('2021-03-20T11:30:05.000Z'), state: 'WA', price: 14, quantity: 140, averageQuantityForState: 126 } ]
前の例では、次のようになります。
partitionBy: "$state"はコレクション内のドキュメントをstateで分割します。CAとWAのパーティションがあります。sortBy: { orderDate: 1 }は、各パーティション内のドキュメントをorderDateで昇順(1)に並べ替えるので、最も古いorderDateが最初になります。