Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /
Operadores de pipeline de agregación

$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 etapa $setWindowFields.

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

$expMovingAvg sintaxis:

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

$expMovingAvg toma un documento con estos campos:

Campo
Descripción

Especifica la expresión a 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 se puede especificar ambos.

El valor N se utiliza en esta fórmula para calcular el resultado actual basándose en el valor de la expresión del documento actual que se está leyendo y en el resultado previo 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 utilizará en el cálculo del promedio móvil exponencial. Un valor más alto de alpha asigna una menor importancia matemática a los resultados anteriores del cálculo.

Debe especificar N o alfa. No se puede especificar ambos.

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

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

Debe especificar N o alpha. No puedes 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 usa $expMovingAvg en la etapa $setWindowFields para obtener la media móvil exponencial de los precios de las acciones usando alfa configurado en 0.75:

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