Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

$expMovingAvg (agregação)

Nesta página

  • Definição
  • Comportamento
  • Exemplos

Novidades na versão 5,0.

$expMovingAvg

Retorna a média móvel exponencial de expressõ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 aceita um documento com estes campos:

Campo
Descrição
Entrada

Especifica a expressão para avaliar. Expressões não numéricas são ignoradas.

Um integer que especifica o número de documentos históricos que têm um peso matemático significativo no cálculo da média móvel exponencial, com os documentos mais recentes contribuem com o maior peso.

Você deve especificar N ou alpha. Não é possível especificar ambos.

O valor N é usado nesta fórmula para calcular o resultado atual com base no valor de expressão do documento atual que está sendo lido e no resultado anterior do cálculo:

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

Um double que especifica o valor de decaimento exponencial a ser utilizado no cálculo da média móvel exponencial. Um valor alpha mais alto atribui uma significância matemática menor aos resultados anteriores do cálculo.

Você deve especificar N ou alpha. Não é possível especificar ambos.

O valor alpha é usado nesta fórmula para calcular o resultado atual com base no valor de expressão do documento atual que está sendo lido e no resultado anterior do cálculo:

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

Você deve especificar N ou alpha. Não é possível especificar ambos.

$expMovingAvg ignora valores não numéricos, valores null e campos ausentes.

Crie uma coleção stockPrices que contenha preços para 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 }
] )

Este exemplo usa $expMovingAvg no estágio $setWindowFields para gerar 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 por stock. Existem partições para "MDB" e "MSFT".

  • sortBy: { date: 1 } classifica os documentos em cada partição por date em ordem crescente (1), para que o date mais antigo seja o primeiro.

  • output retorna a média móvel exponencial para o campo de ações price com N definido como 2:

    • Nos documentos de entrada, há um documento para cada dia e os documentos são ordenados por date. Portanto, com N definido como 2, price no documento atual e price no documento anterior, se disponíveis, recebem o maior peso na fórmula da média móvel exponencial.

    • A média móvel exponencial do campo price é armazenada em um novo campo denominado expMovingAvgForStocks, 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 }

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 para 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 por stock. Existem partições para "MDB" e "MSFT".

  • sortBy: { date: 1 } classifica os documentos em cada partição por date em ordem crescente (1), para que o date mais antigo seja o primeiro.

  • output define a média móvel exponencial para os preços das ações em um novo campo chamado expMovingAvgForStock, conforme mostrado nos resultados a seguir. O valor de alfa é definido como 0.75 na 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 }
← $exp (agregação)