$expMovingAvg (aggregation)

On this page本页内容

Definition定义

New in version 5.0.在版本5.0中新增

$expMovingAvg

Returns the exponential moving average of numeric expressions applied to documents in a partition defined in the $setWindowFields stage.返回应用于$setWindowFields阶段中定义的分区中的文档的数值表达式的指数移动平均值。

$expMovingAvg is only available in the $setWindowFields stage.仅在$setWindowFields阶段可用。

$expMovingAvg syntax:语法:

{
   $expMovingAvg: {
      input: <input expression>,
      N: <integer>,
      alpha: <float>
   }
}

$expMovingAvg takes a document with these fields:获取包含以下字段的文档:

Field字段Description描述
input

Specifies the expression to evaluate. 指定要计算的表达式Non-numeric expressions are ignored.忽略非数值表达式。

N

An integer that specifies the number of historical documents that have a significant mathematical weight in the exponential moving average calculation, with the most recent documents contributing the most weight.一个integer,指定在指数移动平均计算中具有重要数学权重的历史文档的数量,其中最新文档的权重最大。

You must specify either N or alpha. 必须指定NalphaYou cannot specify both.不能同时指定两者。

The N value is used in this formula to calculate the current result based on the expression value from the current document being read and the previous result of the calculation:在该公式中,N值用于根据读取的当前文档的表达式值和之前的计算结果计算当前结果:

current result = current value * ( 2 / ( N + 1 ) ) +
                 previous result * ( 1 - ( 2 / ( N + 1 ) ) )
alpha

A double that specifies the exponential decay value to use in the exponential moving average calculation. 指定指数移动平均计算中使用的指数衰减值的doubleA higher alpha value assigns a lower mathematical significance to previous results from the calculation.较高的alpha值将较低的数学意义分配给先前的计算结果。

You must specify either N or alpha. 必须指定NalphaYou cannot specify both.不能同时指定两者。

The alpha value is used in this formula to calculate the current result based on the expression value from the current document being read and the previous result of the calculation:该公式中使用alpha值根据当前读取文档的表达式值和之前的计算结果计算当前结果:

current result = current value * alpha +
                 previous result * ( 1 - alpha )

Behavior行为

You must specify either N or alpha. 必须指定NalphaYou cannot specify both.不能同时指定两者。

$expMovingAvg ignores non-numeric values, null values, and missing fields.忽略非数值、null值和缺少的字段。

Examples示例

Create a stockPrices collection that contains prices for stocks named "ABC" and "DEF":创建包含名为"ABC""DEF"的股票价格的stockPrices集合:

db.stockPrices.insertMany( [
   { stock: "ABC", date: new Date( "2020-05-18T20:00:00Z" ), price: 13 },
   { stock: "ABC", date: new Date( "2020-05-19T20:00:00Z" ), price: 15.4 },
   { stock: "ABC", date: new Date( "2020-05-20T20:00:00Z" ), price: 12 },
   { stock: "ABC", date: new Date( "2020-05-21T20:00:00Z" ), price: 11.7 },
   { stock: "DEF", date: new Date( "2020-05-18T20:00:00Z" ), price: 82 },
   { stock: "DEF", date: new Date( "2020-05-19T20:00:00Z" ), price: 94 },
   { stock: "DEF", date: new Date( "2020-05-20T20:00:00Z" ), price: 112 },
   { stock: "DEF", date: new Date( "2020-05-21T20:00:00Z" ), price: 97.3 }
] )

Exponential Moving Average Using N使用N的指数移动平均

This example uses $expMovingAvg in the $setWindowFields stage to output the exponential moving average for the stock prices weighted for two historical documents (two days for the example documents) using N set to 2:本例使用$setWindowFields阶段中的$expMovingAvg输出两个历史文档(示例文档为两天)加权的股票价格的指数移动平均值,使用N设置为2

db.stockPrices.aggregate( [
   {
      $setWindowFields: {
         partitionBy: "$stock",
         sortBy: { date: 1 },
         output: {
            expMovingAvgForStock: {
               $expMovingAvg: { input: "$price", N: 2 }
            }
         }
      }
   }
] )

In the example:在该示例中:

  • partitionBy: "$stock" partitions the documents in the collection by stock. stock对集合中的文档进行分区There are partitions for "ABC" and "DEF"."ABC""DEF"的分区。
  • sortBy: { date: 1 } sorts the documents in each partition by date in ascending order (1), so the earliest date is first.date按升序(1)对每个分区中的文档进行排序,因此最早的date是第一个。
  • output returns the exponential moving average for the stock price field with N set to 2:返回股票price字段的指数移动平均值,N设置为2

    • In the input documents, there is one document for each day and the documents are ordered by date. 在输入文档中,每天有一个文档,文档按date排序。Therefore, with N is set to 2, the price in the current document and the price in the previous document, if available, are allocated the highest weight in the exponential moving average formula.因此,当N设置为2时,当前文档中的price和上一文档中的price(如果可用)将在指数移动平均公式中分配最高权重。
    • The exponential moving average for the price field is stored in a new field called expMovingAvgForStocks, as shown in the following results.price字段的指数移动平均值存储在名为expMovingAvgForStocks的新字段中,如以下结果所示。
{ "_id" : ObjectId("60d11fef833dfeadc8e6286b"), "stock" : "ABC",
  "date" : ISODate("2020-05-18T20:00:00Z"), "price" : 13,
  "expMovingAvgForStock" : 13 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286c"), "stock" : "ABC",
  "date" : ISODate("2020-05-19T20:00:00Z"), "price" : 15.4,
  "expMovingAvgForStock" : 14.6 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286d"), "stock" : "ABC",
  "date" : ISODate("2020-05-20T20:00:00Z"), "price" : 12,
  "expMovingAvgForStock" : 12.866666666666667 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286e"), "stock" : "ABC",
  "date" : ISODate("2020-05-21T20:00:00Z"), "price" : 11.7,
  "expMovingAvgForStock" : 12.088888888888889 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286f"), "stock" : "DEF",
  "date" : ISODate("2020-05-18T20:00:00Z"), "price" : 82,
  "expMovingAvgForStock" : 82 }
{ "_id" : ObjectId("60d11fef833dfeadc8e62870"), "stock" : "DEF",
  "date" : ISODate("2020-05-19T20:00:00Z"), "price" : 94,
  "expMovingAvgForStock" : 90 }
{ "_id" : ObjectId("60d11fef833dfeadc8e62871"), "stock" : "DEF",
  "date" : ISODate("2020-05-20T20:00:00Z"), "price" : 112,
  "expMovingAvgForStock" : 104.66666666666667 }
{ "_id" : ObjectId("60d11fef833dfeadc8e62872"), "stock" : "DEF",
  "date" : ISODate("2020-05-21T20:00:00Z"), "price" : 97.3,
  "expMovingAvgForStock" : 99.75555555555556 }

Exponential Moving Average Using alpha使用alpha的指数移动平均

This example uses $expMovingAvg in the $setWindowFields stage to output the exponential moving average for the stock prices using alpha set to 0.75:本例使用$setWindowFields阶段中的$expMovingAvg,使用alpha设置为0.75输出股票价格的指数移动平均值:

db.stockPrices.aggregate( [
   {
      $setWindowFields: {
         partitionBy: "$stock",
         sortBy: { date: 1 },
         output: {
            expMovingAvgForStock: {
               $expMovingAvg: { input: "$price", alpha: 0.75 }
            }
         }
      }
   }
] )

In the example:在该示例中:

  • partitionBy: "$stock" partitions the documents in the collection by stock. stock对集合中的文档进行分区There are partitions for "ABC" and "DEF"."ABC""DEF"的分区。
  • sortBy: { date: 1 } sorts the documents in each partition by date in ascending order (1), so the earliest date is first.date按升序(1)对每个分区中的文档进行排序,因此最早的date是第一个。
  • output sets the exponential moving average for the stock prices in a new field called expMovingAvgForStock, as shown in the following results. 在名为expMovingAvgForStock的新字段中设置股票价格的指数移动平均值,如以下结果所示。The value for alpha is set to 0.75 in the exponential moving average formula.指数移动平均公式中,alpha值设置为0.75
{ "_id" : ObjectId("60d11fef833dfeadc8e6286b"), "stock" : "ABC",
  "date" : ISODate("2020-05-18T20:00:00Z"), "price" : 13,
  "expMovingAvgForStock" : 13 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286c"), "stock" : "ABC",
  "date" : ISODate("2020-05-19T20:00:00Z"), "price" : 15.4,
  "expMovingAvgForStock" : 14.8 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286d"), "stock" : "ABC",
  "date" : ISODate("2020-05-20T20:00:00Z"), "price" : 12,
  "expMovingAvgForStock" : 12.7 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286e"), "stock" : "ABC",
  "date" : ISODate("2020-05-21T20:00:00Z"), "price" : 11.7,
  "expMovingAvgForStock" : 11.95 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286f"), "stock" : "DEF",
  "date" : ISODate("2020-05-18T20:00:00Z"), "price" : 82,
  "expMovingAvgForStock" : 82 }
{ "_id" : ObjectId("60d11fef833dfeadc8e62870"), "stock" : "DEF",
  "date" : ISODate("2020-05-19T20:00:00Z"), "price" : 94,
  "expMovingAvgForStock" : 91 }
{ "_id" : ObjectId("60d11fef833dfeadc8e62871"), "stock" : "DEF",
  "date" : ISODate("2020-05-20T20:00:00Z"), "price" : 112,
  "expMovingAvgForStock" : 106.75 }
{ "_id" : ObjectId("60d11fef833dfeadc8e62872"), "stock" : "DEF",
  "date" : ISODate("2020-05-21T20:00:00Z"), "price" : 97.3,
  "expMovingAvgForStock" : 99.6625 }
←  $exp (aggregation)$filter (aggregation) →