Definição
Novidades na versão 5.0.
Retorna a média móvel exponencial deexpressões numéricas aplicadas a documentos em uma partição definida no estágio $setWindowFields .
$expMovingAvg está disponível somente no estágio $setWindowFields.
$expMovingAvg sintaxe:
{ $expMovingAvg: { input: <input expression>, N: <integer>, alpha: <float> } }
$expMovingAvg pega um documento com estes campos:
Campo | Descrição | ||
|---|---|---|---|
Especifica a expressão a ser avaliada. Expressões não numéricas são ignoradas. | |||
Um Você deve especificar N ou alpha. Não é possível especificar ambos. O valor | |||
Um Você deve especificar N ou alpha. Não é possível especificar ambos. O valor |
Comportamento
Você deve especificar N ou alpha. Não é possível especificar ambos.
$expMovingAvg ignora valores não numéricos, valores null e campos ausentes.
Exemplos
Crie uma coleção stockPrices que contenha os preços das ações denominadas "MDB" e "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 } ] )
Uso da média móvel exponencial N
Este exemplo usa $expMovingAvg no estágio $setWindowFields para produzir a média móvel exponencial para os preços das ações ponderados para dois documentos históricos (dois dias para os documentos de exemplo) usando N definido como 2:
db.stockPrices.aggregate( [ { $setWindowFields: { partitionBy: "$stock", sortBy: { date: 1 }, output: { expMovingAvgForStock: { $expMovingAvg: { input: "$price", N: 2 } } } } } ] )
No exemplo:
partitionBy: "$stock"particiona os documentos na collection porstock. Existem partições para"MDB"e"MSFT".sortBy: { date: 1 }classifica os documentos em cada partição pordateem ordem crescente (1), para que odatemais antigo seja o primeiro.outputretorna a média móvel exponencial para o campo de açõespricecom N definido como2:Nos documentos de entrada, há um documento para cada dia e os documentos são ordenados por
date. Portanto, com N definido como2, opriceno documento atual e opriceno documento anterior, se disponível, recebem o peso mais alto na fórmula da média móvel exponencial.A média móvel exponencial para o campo
priceé armazenada em um novo campo chamadoexpMovingAvgForStocks, conforme mostrado nos resultados a seguir.
{ "_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 }
Uso da média móvel exponencial alpha
Este exemplo utiliza $expMovingAvg no estágio $setWindowFields para produzir a média móvel exponencial para os preços das ações utilizando alfa configurado como 0.75:
db.stockPrices.aggregate( [ { $setWindowFields: { partitionBy: "$stock", sortBy: { date: 1 }, output: { expMovingAvgForStock: { $expMovingAvg: { input: "$price", alpha: 0.75 } } } } } ] )
No exemplo:
partitionBy: "$stock"particiona os documentos na collection porstock. Existem partições para"MDB"e"MSFT".sortBy: { date: 1 }classifica os documentos em cada partição pordateem ordem crescente (1), para que odatemais antigo seja o primeiro.outputdefine a média móvel exponencial para os preços das ações em um novo campo chamadoexpMovingAvgForStock, conforme mostrado nos resultados a seguir. O valor de alfa é definido como0.75na fórmula da média móvel exponencial.
{ "_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 }