文档菜单
文档首页
/
MongoDB 手册
/ / /

$expMovingAvg (聚合)

本页内容

  • 定义
  • 行为
  • 示例

版本5.0.

$expMovingAvg

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

$expMovingAvg仅在$setWindowFields阶段可用。

$expMovingAvg语法

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

$expMovingAvg接受具有以下字段的文档

字段
描述

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

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

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

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

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

一个指定在指数移动平均计算中使用的指数衰减值的双精度浮点数。较高的alpha值将赋予计算中的先前结果较低的数学重要性。

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

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

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

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

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

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

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 }
] )

此示例使用 $expMovingAvg$setWindowFields 阶段中输出股票价格指数移动平均,使用 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 返回具有 N 设置为 2 的股票 price 字段的指数移动平均

    • 在输入文档中,每天有一份文档,文档按日期排序。因此,当N设置为2时,当前文档中的价格和前一份文档中(如果有)的价格指数移动平均公式中被赋予最高的权重。

    • 价格字段的指数移动平均存储在一个名为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

本页内容

© . All rights reserved.