Docs Menu
Docs Home
/ /
Operadores de tuberías de agregación

$expMovingAvg (operador de expresión)

Nuevo en la versión 5.0.

$expMovingAvg

Devuelve el promedio móvil exponencial de valores 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 la cantidad de documentos históricos que tienen un peso matemático significativo en el cálculo del promedio móvil exponencial, donde los documentos más recientes 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 los valores no numéricos, null los valores y los campos faltantes.

Cree una colección stockPrices que contenga los precios de las acciones denominadas "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 para generar el promedio móvil exponencial de los precios de las $setWindowFields acciones ponderados para dos documentos históricos (dos días para los documentos de ejemplo) utilizando N establecido 2 en:

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 el promedio móvil exponencial para el price campo de acciones con N establecido 2 en:

    • En los documentos de entrada, hay un documento por cada día y están ordenados date por. Por lo tanto, si N se establece 2 en, el price del documento actual y el price del documento anterior, si están disponibles, reciben la mayor ponderación en la fórmula de media móvil exponencial.

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