Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

$expMovingAvg (operador de expresión)

Nuevo en la versión 5.0.

$expMovingAvg

Devuelve el promedio móvil exponencial de datos numéricos. expresiones aplicadas a documentos en una partición definida en la $setWindowFields etapa.

$expMovingAvg solo está disponible en la $setWindowFields etapa.

$expMovingAvg sintaxis:

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

$expMovingAvg toma un documento con estos campos:

Campo
Descripción

Especifica la expresión que se evaluará. Las expresiones no numéricas se ignoran.

Un integer que especifica el número de documentos históricos que tienen un peso matemático significativo en el cálculo de la media móvil exponencial, siendo los documentos más recientes los que aportan el mayor peso.

Debe especificar N o alfa. No puede especificar ambos.

El N valor se utiliza en esta fórmula para calcular el resultado actual en función del valor de la expresión del documento actual que se está leyendo y el resultado anterior del cálculo:

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

Un double que especifica el valor de decaimiento exponencial que se usará en el cálculo de la media móvil exponencial. Un valor alpha más alto asigna una menor significancia matemática a los resultados previos del cálculo.

Debe especificar N o alfa. No puede especificar ambos.

El alpha valor se utiliza en esta fórmula para calcular el resultado actual en función del valor de la expresión del documento actual que se está leyendo y el resultado anterior del cálculo:

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

Debe especificar N o alfa. No puede especificar ambos.

$expMovingAvg ignora valores no numéricos, valores null, y campos faltantes.

Crea una colección de stockPrices que contenga precios de acciones nombradas "MDB" y "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 ejemplo utiliza $expMovingAvg en la etapa $setWindowFields para generar la media móvil exponencial de los precios de las acciones ponderados para dos documentos históricos (dos días para los documentos de ejemplo) utilizando N establecido en 2:

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

En el ejemplo:

  • partitionBy: "$stock" particiona los documentos de la colección en stock. Existen particiones para "MDB" y "MSFT".

  • sortBy: { date: 1 } ordena los documentos de cada partición por date en orden ascendente (1), de modo que el date más antiguo sea el primero.

  • output devuelve la media móvil exponencial para el price campo de acciones con <a class=\" \" target=\" \" href=\" \"> N establecido 2 en:

    • En los documentos de entrada, hay un documento por cada día y los documentos se ordenan por date. Por lo tanto, con N establecido en 2, el price en el documento actual y el price en el documento anterior, si está disponible, se les asigna el peso más alto en la fórmula de promedio móvil exponencial.

    • El promedio móvil exponencial para el campo price se almacena en un nuevo campo llamado expMovingAvgForStocks, como se muestra en los siguientes resultados.

{ "_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 ejemplo utiliza $expMovingAvg en la etapa para generar el promedio móvil $setWindowFields exponencial de los precios de las acciones utilizando alfa establecido 0.75 en:

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

En el ejemplo:

  • partitionBy: "$stock" particiona los documentos de la colección en stock. Existen particiones para "MDB" y "MSFT".

  • sortBy: { date: 1 } ordena los documentos de cada partición por date en orden ascendente (1), de modo que el date más antiguo sea el primero.

  • output establece la media móvil exponencial para los precios de las acciones en un nuevo campo llamado expMovingAvgForStock, como se muestra en los siguientes resultados. El valor para alfa se establece en 0.75 en la fórmula de media móvil 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 }

Volver

$exp

En esta página