$setWindowFields (Definir Campos de Janela)
Última atualização: 2026-10-09
$setWindowFields (Definir Campos de Janela)
$setWindowFields realiza cálculos de janela — classificações, médias móveis, totais acumulados — sobre partições e grava os resultados de volta em cada documento. Especifique os campos de saída com operadores de janela (como $rank, $denseRank ou acumuladores), uma ordem sortBy e um intervalo de janela opcional. Pense nas funções de janela do SQL.
| Categoria | Agrupamento e Janela |
|---|---|
| Versão do MongoDB | 5.0+ |
| Idioma do Exemplo | mongosh (Shell) |
📝 Sintaxe
{ $setWindowFields: { partitionBy: <expression>, sortBy: { <field>: <1 or -1> }, output: { <field>: { <windowOperator>: ..., window: { documents: [...], range: [...] } } } } }
⚙️ Parâmetros
| partitionBy | Expressão de partição; quando omitida, todos os documentos formam uma única partição. |
|---|---|
| sortBy | Ordem de classificação dentro das partições, que determina a ordem de cálculo da janela. |
| output | Campos de saída com suas definições de operador de janela. |
Retorno:Fluxo de documentos com campos calculados por janela adicionados
▶ Exemplo
Execute os comandos abaixo no seu mongosh local (requer um mongod em execução):
// $setWindowFields: total acumulado por região
db.sales.aggregate([
{ $setWindowFields: {
partitionBy: '$region',
sortBy: { date: 1 },
output: {
runningTotal: { $sum: '$amount', window: { documents: ['unbounded', 'current'] } }
}
} }
])
Saída:
// Cada venda ganha um total acumulado
{ "region": "EAST", "date": "2024-01-02", "amount": 30, "runningTotal": 30 }
📌 Notas
- Ao menos um campo de saída é obrigatório; sortBy e os operadores de janela definem a ordem do cálculo
- Os intervalos de janela são expressos por documents ou range
- Sem partitionBy, todo o fluxo é uma única partição
🏷️ Tags Relacionados
💡 Casos Relacionados
Pipelines de agregação avançados: expressões e transformações complexas
Introdução aos pipelines de agregação: o método `aggregate` e o estágio básico
📚 Tutoriais Relacionados
❓ Perguntas Frequentes
QQual é a diferença entre $setWindowFields e $group?
A$group colapsa um grupo em um único documento; $setWindowFields mantém todos os documentos e grava os resultados de janela de volta neles.
QEle consegue calcular uma média móvel?
ASim, defina a janela dos 7 documentos anteriores até o atual e use o acumulador $avg.
QComo escrevo um intervalo de janela?
APor exemplo, { documents: ['unbounded', 'current'] } abrange do início da partição até o documento atual; range define um intervalo de valores.