定义
版本 5.0 中的新增功能。
返回在 $setWindowFields 阶段定义的分区中应用于文档的数字表达式的指数移动平均值。
$expMovingAvg仅在$setWindowFields 阶段可用。
$expMovingAvg 事务语法:
{ $expMovingAvg: { input: <input expression>, N: <integer>, alpha: <float> } }
$expMovingAvg 接受包含以下字段的文档:
字段 | 说明 |
|---|---|
指定要评估的表达式。非数字表达式将被忽略。 | |
行为
$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 } ] )
指数移动平均线使用 N
此示例在 阶段使用$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返回股票price2字段的指数移动平均值,其中 N设立为 :在输入文档中,每天一个文档,按
date排序。因此,当 N设立为 时,当前文档中的2price和上一个文档中的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 }
指数移动平均线使用 alpha
此示例在 阶段使用$expMovingAvg $setWindowFields输出股票价格的指数移动平均值,并将 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 }