Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

$expMovingAvg(聚合)

在此页面上

  • 定义
  • 行为
  • 示例

版本 5.0 中的新增功能

$expMovingAvg

返回数值 表达式 $setWindowFields的指数移动平均值,该表达式应用于 阶段定义的 分区 中的文档。

$expMovingAvg 只能在 $setWindowFields 阶段使用。

$expMovingAvg 事务语法:

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

$expMovingAvg 接受包含以下字段的文档:

字段
说明

指定要评估的表达式。非数字表达式将被忽略。

一个 integer,它指定在指数移动平均线计算中具有显著数学权重的历史文档的数量,最新的文档贡献的权重最大。

必须指定 Nalpha。不能同时指定两者。

此公式使用 N 值并根据正在读取的当前文档的表达式值和先前的计算结果来计算当前结果:

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

double ,用于指定指数移动平均值计算中使用的指数衰减值。alpha 值越高,表示之前计算结果的数学意义越低。

必须指定 Nalpha。不能同时指定两者。

此公式使用 alpha 值并根据正在读取的当前文档的表达式值和先前的计算结果来计算当前结果:

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

必须指定 Nalpha。不能同时指定两者。

$expMovingAvg 忽略非数字值、null 值和缺失字段。

创建一个 stockPrices 集合,其中包含名为 "MDB""MSFT" 的股票的价格:

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

此示例在 $setWindowFields 阶段使用 $expMovingAvg 来输出股票价格的指数移动平均值,该平均值由两个历史文档(示例文档为两天)加权计算,N 设置为 2

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

在示例中:

  • partitionBy: "$stock"stock 对集合中的文档分区"MDB""MSFT" 都有分区。

  • sortBy: { date: 1 }date 以升序 (1) 对每个分区中的文档进行排序,因此最早的 date 位于最前面。

  • output 返回股票price字段的指数移动平均值,其中N设置为2

    • 在输入文档中,每天有一个文档,该文档按照 date 进行排序。因此,当 N 设置为 2 时,当前文档中的 price 和上一个文档中的 price(如果可用)在指数移动平均公式中分配最高权重。

    • price 字段的指数移动平均值存储在名为 expMovingAvgForStocks 的新字段中,如以下结果所示。

{ "_id" : ObjectId("60d11fef833dfeadc8e6286b"), "stock" : "MDB",
"date" : ISODate("2020-05-18T20:00:00Z"), "price" : 13,
"expMovingAvgForStock" : 13 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286c"), "stock" : "MDB",
"date" : ISODate("2020-05-19T20:00:00Z"), "price" : 15.4,
"expMovingAvgForStock" : 14.6 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286d"), "stock" : "MDB",
"date" : ISODate("2020-05-20T20:00:00Z"), "price" : 12,
"expMovingAvgForStock" : 12.866666666666667 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286e"), "stock" : "MDB",
"date" : ISODate("2020-05-21T20:00:00Z"), "price" : 11.7,
"expMovingAvgForStock" : 12.088888888888889 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286f"), "stock" : "MSFT",
"date" : ISODate("2020-05-18T20:00:00Z"), "price" : 82,
"expMovingAvgForStock" : 82 }
{ "_id" : ObjectId("60d11fef833dfeadc8e62870"), "stock" : "MSFT",
"date" : ISODate("2020-05-19T20:00:00Z"), "price" : 94,
"expMovingAvgForStock" : 90 }
{ "_id" : ObjectId("60d11fef833dfeadc8e62871"), "stock" : "MSFT",
"date" : ISODate("2020-05-20T20:00:00Z"), "price" : 112,
"expMovingAvgForStock" : 104.66666666666667 }
{ "_id" : ObjectId("60d11fef833dfeadc8e62872"), "stock" : "MSFT",
"date" : ISODate("2020-05-21T20:00:00Z"), "price" : 97.3,
"expMovingAvgForStock" : 99.75555555555556 }

此示例在 $setWindowFields 阶段使用 $expMovingAvg 来输出股票价格的指数移动平均线,并将 Alpha 设置为0.75

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

在示例中:

  • partitionBy: "$stock"stock 对集合中的文档分区"MDB""MSFT" 都有分区。

  • sortBy: { date: 1 }date 以升序 (1) 对每个分区中的文档进行排序,因此最早的 date 位于最前面。

  • output 在名为expMovingAvgForStock的新字段中设置股票价格的指数移动平均值,如以下结果所示。 在 指数移动平均公式 中, Alpha 的值设置为 。0.75

{ "_id" : ObjectId("60d11fef833dfeadc8e6286b"), "stock" : "MDB",
"date" : ISODate("2020-05-18T20:00:00Z"), "price" : 13,
"expMovingAvgForStock" : 13 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286c"), "stock" : "MDB",
"date" : ISODate("2020-05-19T20:00:00Z"), "price" : 15.4,
"expMovingAvgForStock" : 14.8 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286d"), "stock" : "MDB",
"date" : ISODate("2020-05-20T20:00:00Z"), "price" : 12,
"expMovingAvgForStock" : 12.7 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286e"), "stock" : "MDB",
"date" : ISODate("2020-05-21T20:00:00Z"), "price" : 11.7,
"expMovingAvgForStock" : 11.95 }
{ "_id" : ObjectId("60d11fef833dfeadc8e6286f"), "stock" : "MSFT",
"date" : ISODate("2020-05-18T20:00:00Z"), "price" : 82,
"expMovingAvgForStock" : 82 }
{ "_id" : ObjectId("60d11fef833dfeadc8e62870"), "stock" : "MSFT",
"date" : ISODate("2020-05-19T20:00:00Z"), "price" : 94,
"expMovingAvgForStock" : 91 }
{ "_id" : ObjectId("60d11fef833dfeadc8e62871"), "stock" : "MSFT",
"date" : ISODate("2020-05-20T20:00:00Z"), "price" : 112,
"expMovingAvgForStock" : 106.75 }
{ "_id" : ObjectId("60d11fef833dfeadc8e62872"), "stock" : "MSFT",
"date" : ISODate("2020-05-21T20:00:00Z"), "price" : 97.3,
"expMovingAvgForStock" : 99.6625 }

后退

$exp

在此页面上