Definição
Retorna a soma de valores numéricos de documentos em uma janela específica.
Observação
Outros usos de $sum
Esta página descreve $sum quando usado como uma função de janela.
Você também pode usar $sum nestes outros contextos:
$sum (accumulator), que retorna a soma coletiva de valores numéricos em um grupo de documentos.$sum (expression), que retorna a soma de valores numéricos em uma array.
Sintaxe
{ $setWindowFields: { ... output: { <field>: { $sum: <expression> } } } }
Comportamento
Tipo de resultado
Quando os tipos de entrada são mistos, $sum promove o tipo de entrada menor para o maior dos dois. Um tipo é considerado maior quando representa uma faixa de valores mais ampla. A ordem dos tipos numéricos do menor para o maior é: inteiro → longo → duplo → decimal.
O maior dos tipos de entrada também determina o tipo de resultado, a menos que a operação se exceda e esteja além da faixa representada por esse tipo de dados maior. Em casos de excesso, $sum promove o resultado de acordo com a seguinte ordem:
Valores nulos ou ausentes
Se alguns documentos na janela tiverem um valor null para o campo ou estiverem faltando o campo, $sum ignorará esses valores e somará os valores restantes.
Se todos os documentos na janela tiverem um valor null para o campo ou estiverem faltando o campo, $sum retornará 0.
Exemplo
Os exemplos nesta página usam dados do conjunto de dados sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.
Este exemplo usa $setWindowFields para calcular um total de votos cumulativos em execução para cada filme Universal de 2009 e 2010. Cada documento recebe o valor $sum calculado desde o início de sua partição anual até o documento atual.
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 } } ] )
O pipeline anterior:
Usa
$matchpara filtrar filmes músicas de 2009 e 2010 com uma classificação numérica do IMDb e pelo menos um voto.Utiliza
$setWindowFieldspara dividir filmes poryeare classificá-los portitle. O estágio usa$sumcom uma janela de documentos de[ "unbounded", "current" ]para criar os seguintes campos para cada documento:cumulativeVotesInYear: a soma cumulativa em execução deimdb.votes.rankInYear: um número de linha por partição atribuído por$documentNumber.
Utiliza
$projectpara incluirtitle,year,imdb.votes,cumulativeVotesInYearerankInYearna saída.Utiliza
$sortpara classificar os resultados por ano e título.