Definición
Devuelve la suma de los valores numéricos de los documentos en una ventana específica.
Nota
Otros usos de $sum
Esta página describe $sum cuando se utiliza como función de ventana.
También puedes usar $sum en estos otros contextos:
$sum (accumulator), que devuelve la suma colectiva de los valores numéricos de un grupo de documentos.$sum (expression), que devuelve la suma de los valores numéricos en una matriz.
Sintaxis
{ $setWindowFields: { ... output: { <field>: { $sum: <expression> } } } }
Comportamiento
Tipo de resultado
Cuando se mezclan tipos de entrada, $sum prioriza el tipo de entrada más pequeño sobre el más grande. Un tipo se considera más grande cuando representa un rango de valores más amplio. El orden de los tipos numéricos de menor a mayor es: entero → largo → doble → decimal.
El tipo de entrada mayor también determina el tipo de resultado, a menos que la operación se desborde y salga del rango representado por ese tipo de dato mayor. En casos de desbordamiento, $sum promueve el resultado según el siguiente orden:
Valores nulos o faltantes
Si algunos documentos en la ventana tienen un valor null para el campo o les falta el campo, $sum ignora esos valores y suma los valores restantes.
Si todos los documentos de la ventana tienen un valor null para el campo o les falta el campo, $sum devuelve 0.
Ejemplo
Los ejemplos de esta página utilizan datos del conjunto de datos sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en su implementación autogestionada de MongoDB, consulte Cargar el conjunto de datos de ejemplo. Si realizó alguna modificación en las bases de datos de ejemplo, es posible que deba eliminarlas y volver a crearlas para ejecutar los ejemplos de esta página.
Este ejemplo utiliza $setWindowFields para calcular un total acumulado de votos para cada película musical de 2009 y 2010. Cada documento recibe el valor $sum calculado desde el inicio de su partición anual hasta el documento actual.
db.movies.aggregate( [ { $match: { genres: "Musical", year: { $in: [ 2009, 2010 ] }, "imdb.rating": { $type: "double" }, "imdb.votes": { $gt: 0 } } }, { $setWindowFields: { partitionBy: "$year", sortBy: { title: 1 }, output: { cumulativeVotesInYear: { $sum: "$imdb.votes", window: { documents: [ "unbounded", "current" ] } }, rankInYear: { $documentNumber: {} } } } }, { $project: { _id: 0, title: 1, year: 1, "imdb.votes": 1, cumulativeVotesInYear: 1, rankInYear: 1 } }, { $sort: { year: 1, title: 1 } } ] )
La tubería precedente:
Utiliza
$matchpara filtrar películas musicales de 2009 y 2010 con una calificación numérica de IMDb y al menos un voto.Utiliza
$setWindowFieldspara particionar las películas poryeary ordenarlas portitle. La etapa utiliza$sumcon una ventana de documentos de[ "unbounded", "current" ]para crear los siguientes campos para cada documento:cumulativeVotesInYear: la suma acumulativa deimdb.votes.rankInYear: un número de fila por partición asignado por$documentNumber.
Utiliza
$projectpara incluirtitle,year,imdb.votes,cumulativeVotesInYearyrankInYearen la salida.Utiliza
$sortpara ordenar los resultados por año y título.