Definição
Novidade na versão 5.0.
Executa operações em um intervalo especificado de documentos em uma coleção, conhecido como janela, e retorna os resultados com base no operador de blocos escolhido.
Por exemplo, você pode utilizar o estágio $setWindowFields para produzir o:
Diferença nas vendas entre dois documentos em uma coleção.
Classificações de vendas.
Total cumulativo de vendas.
Análise de informações complexas de séries temporais sem exportar os dados para um banco de dados externo.
Sintaxe
A sintaxe de estágio $setWindowFields:
{ $setWindowFields: { partitionBy: <expression>, sortBy: { <sort field 1>: <sort order>, <sort field 2>: <sort order>, ..., <sort field n>: <sort order> }, output: { <output field 1>: { <window operator>: <window operator parameters>, window: { documents: [ <lower boundary>, <upper boundary> ], range: [ <lower boundary>, <upper boundary> ], unit: <time unit> } }, <output field 2>: { ... }, ... <output field n>: { ... } } }}O estágio $setWindowFields toma um documento com estes campos:
Campo | necessidade | Descrição |
|---|---|---|
Opcional | Especifica uma expressão para agrupar os documentos. No estágio | |
Necessário para alguns operadores (consulte Restrições) | Especifica o(s) campo(s) para classificar os documentos na partição. Usa a mesma sintaxe do estágio | |
Obrigatório | Especifica o(s) campo(s) a ser(em) anexado(s) aos documentos no resultado retornado pelo estágio Um campo pode conter pontos para especificar campos de documento incorporados e campos de array. A semântica da notação pontilhada do documento incorporado no estágio
| |
Opcional | Especifica os parâmetros e limites da janela. Os limites da janela são inclusivos. O padrão é uma janela sem limite, que inclui todos os documentos na partição. Especifique uma janela de documentos ou faixa. | |
Opcional | Uma janela onde os limites inferior e superior são especificados em relação à posição do documento atual lido na collection. Os limites da janela são especificados usando uma array de dois elementos contendo uma string ou número inteiro de limite inferior e superior. Usar:
Consulte Exemplos de janelas de documentos. | |
Opcional | Uma janela onde os limites inferior e superior são definidos utilizando uma faixa de valores baseada no campo sortBy no documento atual. Os limites da janela são especificados usando uma array de dois elementos contendo uma string ou número de limite inferior e superior. Usar:
Consulte Exemplo de janela de faixa. | |
Opcional |
Dica
Comportamento
O estágio $setWindowFields acrescenta novos campos aos documentos existentes. Você pode incluir um ou mais estágios $setWindowFields em uma operação de agregação.
A partir do MongoDB 5.3, você pode usar o estágio $setWindowFields com transações e a preocupação de leitura "snapshot".
O estágio $setWindowFields não garante a ordem dos documentos retornados.
Operadores de Janela
Esses operadores podem ser utilizados com o estágio $setWindowFields:
- Operadores acumuladores:
$addToSet,$avg,$bottom,$bottomN,$count,$covariancePop,$covarianceSamp,$derivative,$expMovingAvg,$firstN,$integral,$lastN,$max,$maxN,$median,$min,$minN,$percentile,$push,$stdDevSamp,$stdDevPop,$sum,$top,$topN.
- Operadores de preenchimento de lacunas:
$linearFille$locf.
Restrições
Restrições para o estágio $setWindowFields:
Antes do MongoDB 5.3, o estágio
$setWindowFieldsnão pode ser usado:Dentro de transações.
Com a read concern
"snapshot".
sortBy é necessário para:
classifique e ordene operadores de blocos.
Janelas com limites (uma janela de documentos ou uma janela de faixa).
$linearFilloperador.
As janelas de faixa de tempo exigem que todos os valores de sortBy sejam datas.
As janelas de faixa e faixa de tempo só podem conter um campo sortBy e a ordem deve ser ascendente.
Você não pode especificar uma janela de documentos e uma janela de faixa.
Estes operadores usam uma janela implícita e retornam um erro se você especificar uma opção de janela:
Operadores de classificação.
$shiftoperador.
No caso das janelas de faixa, somente números na faixa especificada são incluídos na janela. Valores ausentes, indefinidos e
nullsão excluídos.Para janelas de faixa de tempo:
Somente tipos de data e hora são incluídos na janela.
Os valores de limite numéricos devem ser inteiros. Por exemplo, você pode usar 2 horas como limite, mas não pode usar 1,5 hora.
Para janelas vazias ou janelas com valores incompatíveis (por exemplo, utilizando
$sumem strings), o valor retornado depende do operador:Para todos os outros operadores, o valor retornado é
null.
Exemplos
Os exemplos nesta página usam dados do conjunto de dados sample_mflix. Para obter detalhes sobre como carregar este conjunto de dados em sua implantação do MongoDB autogerenciado, consulte Carregar o conjunto de dados de amostra. Se você fez alguma modificação nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.
Exemplos de janelas de documentos
Use a janela de documentos para obter o tempo de execução cumulativo para cada classificação
Este exemplo usa uma janela de documentos em $setWindowFields para gerar o runtime cumulativo para cada valor rated. No resultado do exemplo , o campo cumulativeRuntimeForRating mostra o runtime cumulativo para cada classificação.
db.movies.aggregate( [ { $match: { metacritic: { $gt: 85 }, year: { $gte: 1993, $lte: 1995 } } }, { $project: { _id: 0, title: 1, rated: 1, released: 1, runtime: 1 } }, { $setWindowFields: { partitionBy: "$rated", sortBy: { released: 1 }, output: { cumulativeRuntimeForRating: { $sum: "$runtime", window: { documents: [ "unbounded", "current" ] } } } } }] )[ { rated: 'G', title: 'Toy Story', released: ISODate('1995-11-22T00:00:00.000Z'), runtime: 81, cumulativeRuntimeForRating: 81 }, { rated: 'PG', title: 'Little Women', released: ISODate('1994-12-25T00:00:00.000Z'), runtime: 115, cumulativeRuntimeForRating: 115 }, { rated: 'PG-13', title: 'The Fugitive', released: ISODate('1993-08-06T00:00:00.000Z'), runtime: 130, cumulativeRuntimeForRating: 130 }, { rated: 'PG-13', title: 'King of the Hill', released: ISODate('1993-08-20T00:00:00.000Z'), runtime: 103, cumulativeRuntimeForRating: 233 }, { runtime: 133, rated: 'PG-13', title: 'Quiz Show', released: ISODate('1994-10-07T00:00:00.000Z'), cumulativeRuntimeForRating: 366 }, { rated: 'PG-13', title: 'Hoop Dreams', released: ISODate('1994-10-14T00:00:00.000Z'), runtime: 170, cumulativeRuntimeForRating: 536 }, { runtime: 195, rated: 'R', title: "Schindler's List", released: ISODate('1994-02-04T00:00:00.000Z'), cumulativeRuntimeForRating: 195 }, { runtime: 121, rated: 'R', title: 'The Piano', released: ISODate('1994-02-11T00:00:00.000Z'), cumulativeRuntimeForRating: 316 }, { rated: 'R', title: 'Pulp Fiction', released: ISODate('1994-10-14T00:00:00.000Z'), runtime: 154, cumulativeRuntimeForRating: 470 }, { runtime: 119, title: 'Crumb', released: ISODate('1995-04-28T00:00:00.000Z'), rated: 'R', cumulativeRuntimeForRating: 589 }, { rated: 'R', title: 'To Die For', released: ISODate('1995-10-06T00:00:00.000Z'), runtime: 106, cumulativeRuntimeForRating: 695 }]No exemplo:
partitionBy: "$rated"particiona os documentos na collection porrated. As partições sãoG,PG,PG-13eR.sortBy: { released: 1 }ordena os documentos em cada partição porreleasedem ordem crescente (1), de modo que a datareleasedmais antiga seja a primeira.
output:Define o campo
cumulativeRuntimeForRatingpara oruntimecumulativo para cada valorrated, que aumenta sucessivamente ao valor anterior na partição.Calcula o
runtimecumulativo utilizando o operador$sumexecutado em uma janela de documentos.A janela contém documentos entre um limite inferior
unboundede o documentocurrent. Isso significa que$sumretorna aruntimecumulativa dos documentos entre o início da partição e o documento atual.
Use a janela de documentos para obter o tempo de execução cumulativo para cada ano
Este exemplo usa uma janela de documentos em $setWindowFields para gerar o runtime cumulativo para cada $year em released. No exemplo de resultados, o campo cumulativeRuntimeForYear mostra o runtime cumulativo para cada ano.
db.movies.aggregate( [ { $match: { metacritic: { $gt: 85 }, year: { $gte: 1993, $lte: 1995 } } }, { $project: { _id: 0, title: 1, released: 1, runtime: 1 } }, { $setWindowFields: { partitionBy: { $year: "$released" }, sortBy: { released: 1 }, output: { cumulativeRuntimeForYear: { $sum: "$runtime", window: { documents: [ "unbounded", "current" ] } } } } }] )[ { title: 'The Fugitive', released: ISODate('1993-08-06T00:00:00.000Z'), runtime: 130, cumulativeRuntimeForYear: 130 }, { title: 'King of the Hill', released: ISODate('1993-08-20T00:00:00.000Z'), runtime: 103, cumulativeRuntimeForYear: 233 }, { runtime: 195, title: "Schindler's List", released: ISODate('1994-02-04T00:00:00.000Z'), cumulativeRuntimeForYear: 195 }, { runtime: 121, title: 'The Piano', released: ISODate('1994-02-11T00:00:00.000Z'), cumulativeRuntimeForYear: 316 }, { runtime: 133, title: 'Quiz Show', released: ISODate('1994-10-07T00:00:00.000Z'), cumulativeRuntimeForYear: 449 }, { title: 'Hoop Dreams', released: ISODate('1994-10-14T00:00:00.000Z'), runtime: 170, cumulativeRuntimeForYear: 619 }, { title: 'Pulp Fiction', released: ISODate('1994-10-14T00:00:00.000Z'), runtime: 154, cumulativeRuntimeForYear: 773 }, { title: 'Little Women', released: ISODate('1994-12-25T00:00:00.000Z'), runtime: 115, cumulativeRuntimeForYear: 888 }, { runtime: 119, title: 'Crumb', released: ISODate('1995-04-28T00:00:00.000Z'), cumulativeRuntimeForYear: 119 }, { title: 'To Die For', released: ISODate('1995-10-06T00:00:00.000Z'), runtime: 106, cumulativeRuntimeForYear: 225 }, { title: 'Toy Story', released: ISODate('1995-11-22T00:00:00.000Z'), runtime: 81, cumulativeRuntimeForYear: 306 }]No exemplo:
sortBy: { released: 1 }ordena os documentos em cada partição porreleasedem ordem crescente (1), de modo que a datareleasedmais antiga seja a primeira.output:Define o campo
cumulativeRuntimeForYearpara oruntimecumulativo para cada ano, que aumenta sucessivamente o valor anterior na partição.Calcula o
runtimecumulativo utilizando o operador$sumexecutado em uma janela de documentos.A janela contém documentos entre um limite inferior
unboundede o documentocurrent. Isso significa que$sumretorna aruntimecumulativa dos documentos entre o início da partição e o documento atual.
Use a janela de documentos para obter a média móvel de tempo de execução para cada ano
Este exemplo utiliza uma janela de documentos em $setWindowFields para produzir a média móvel runtime. No resultado do exemplo , o campo averageRuntime mostra a média móvel runtime.
db.movies.aggregate( [ { $match: { metacritic: { $gt: 85 }, year: { $gte: 1993, $lte: 1995 } } }, { $project: { _id: 0, title: 1, released: 1, runtime: 1 } }, { $setWindowFields: { partitionBy: { $year: "$released" }, sortBy: { released: 1 }, output: { averageRuntime: { $avg: "$runtime", window: { documents: [ -1, 0 ] } } } } }] )[ { title: 'The Fugitive', released: ISODate('1993-08-06T00:00:00.000Z'), runtime: 130, averageRuntime: 130 }, { title: 'King of the Hill', released: ISODate('1993-08-20T00:00:00.000Z'), runtime: 103, averageRuntime: 116.5 }, { runtime: 195, title: "Schindler's List", released: ISODate('1994-02-04T00:00:00.000Z'), averageRuntime: 195 }, { runtime: 121, title: 'The Piano', released: ISODate('1994-02-11T00:00:00.000Z'), averageRuntime: 158 }, { runtime: 133, title: 'Quiz Show', released: ISODate('1994-10-07T00:00:00.000Z'), averageRuntime: 127 }, { title: 'Hoop Dreams', released: ISODate('1994-10-14T00:00:00.000Z'), runtime: 170, averageRuntime: 151.5 }, { title: 'Pulp Fiction', released: ISODate('1994-10-14T00:00:00.000Z'), runtime: 154, averageRuntime: 162 }, { title: 'Little Women', released: ISODate('1994-12-25T00:00:00.000Z'), runtime: 115, averageRuntime: 134.5 }, { runtime: 119, title: 'Crumb', released: ISODate('1995-04-28T00:00:00.000Z'), averageRuntime: 119 }, { title: 'To Die For', released: ISODate('1995-10-06T00:00:00.000Z'), runtime: 106, averageRuntime: 112.5 }, { title: 'Toy Story', released: ISODate('1995-11-22T00:00:00.000Z'), runtime: 81, averageRuntime: 93.5 }]No exemplo:
sortBy: { released: 1 }ordena os documentos em cada partição porreleasedem ordem crescente (1), de modo que a datareleasedmais antiga seja a primeira.output:Define o campo
averageRuntimepara a média móvelruntimepara cada ano.Calcula a média móvel
runtimeutilizando o operador$avgexecutado em uma janela de documentos.A janela contém documentos entre
-1e0. Isso significa que$avgretorna a média móvelruntimeentre o documento antes do documento atual (-1) e o documento atual (0) na partição.
Use a janela de documentos para obter o tempo de execução máximo e cumulativo para cada ano
Este exemplo usa uma janela de documentos em $setWindowFields para gerar os valores runtime cumulativos e máximos para cada $year em released. No resultado de exemplo , o campo cumulativeRuntimeForYear mostra o runtime cumulativo e o campo maximumRuntimeForYear mostra o runtime máximo.
db.movies.aggregate( [ { $match: { metacritic: { $gt: 85 }, year: { $gte: 1993, $lte: 1995 } } }, { $project: { _id: 0, title: 1, released: 1, runtime: 1 } }, { $setWindowFields: { partitionBy: { $year: "$released" }, sortBy: { released: 1 }, output: { cumulativeRuntimeForYear: { $sum: "$runtime", window: { documents: [ "unbounded", "current" ] } }, maximumRuntimeForYear: { $max: "$runtime", window: { documents: [ "unbounded", "unbounded" ] } } } } }] )[ { title: 'The Fugitive', released: ISODate('1993-08-06T00:00:00.000Z'), runtime: 130, cumulativeRuntimeForYear: 130, maximumRuntimeForYear: 130 }, { title: 'King of the Hill', released: ISODate('1993-08-20T00:00:00.000Z'), runtime: 103, cumulativeRuntimeForYear: 233, maximumRuntimeForYear: 130 }, { runtime: 195, title: "Schindler's List", released: ISODate('1994-02-04T00:00:00.000Z'), cumulativeRuntimeForYear: 195, maximumRuntimeForYear: 195 }, { runtime: 121, title: 'The Piano', released: ISODate('1994-02-11T00:00:00.000Z'), cumulativeRuntimeForYear: 316, maximumRuntimeForYear: 195 }, { runtime: 133, title: 'Quiz Show', released: ISODate('1994-10-07T00:00:00.000Z'), cumulativeRuntimeForYear: 449, maximumRuntimeForYear: 195 }, { title: 'Hoop Dreams', released: ISODate('1994-10-14T00:00:00.000Z'), runtime: 170, cumulativeRuntimeForYear: 619, maximumRuntimeForYear: 195 }, { title: 'Pulp Fiction', released: ISODate('1994-10-14T00:00:00.000Z'), runtime: 154, cumulativeRuntimeForYear: 773, maximumRuntimeForYear: 195 }, { title: 'Little Women', released: ISODate('1994-12-25T00:00:00.000Z'), runtime: 115, cumulativeRuntimeForYear: 888, maximumRuntimeForYear: 195 }, { runtime: 119, title: 'Crumb', released: ISODate('1995-04-28T00:00:00.000Z'), cumulativeRuntimeForYear: 119, maximumRuntimeForYear: 119 }, { title: 'To Die For', released: ISODate('1995-10-06T00:00:00.000Z'), runtime: 106, cumulativeRuntimeForYear: 225, maximumRuntimeForYear: 119 }, { title: 'Toy Story', released: ISODate('1995-11-22T00:00:00.000Z'), runtime: 81, cumulativeRuntimeForYear: 306, maximumRuntimeForYear: 119 }]No exemplo:
sortBy: { released: 1 }ordena os documentos em cada partição porreleasedem ordem crescente (1), de modo que a datareleasedmais antiga seja a primeira.output:Define o campo
cumulativeRuntimeForYearcomoruntimecumulativo para cada ano.Calcula o
runtimecumulativo utilizando o operador$sumexecutado em uma janela de documentos.A janela contém documentos entre um limite inferior
unboundede o documentocurrent. Isso significa que$sumretorna aruntimecumulativa dos documentos entre o início da partição e o documento atual.Define o campo
maximumRuntimeForYearpara aruntimemáxima para cada ano.Calcula a
runtimemáxima de todos os documentos usando o operador$maxexecutado em uma janela de documentos.A janela contém documentos entre um limite
unboundedinferior eupper. Isso significa que$maxretorna oruntimemáximo para os documentos na partição.
Exemplo de janela de faixa
Este exemplo usa uma janela de faixa em $setWindowFields para retornar a soma dos valores runtime dos filmes lançados dentro de mais ou menos 10 minutos do valor runtime do documento atual. No resultado do exemplo , o campo runtimeFromSimilarMovies mostra a soma dos valores runtime para documentos na janela.
db.movies.aggregate( [ { $match: { metacritic: { $gt: 85 }, year: { $gte: 1993, $lte: 1995 } } }, { $project: { _id: 0, title: 1, rated: 1, runtime: 1 } }, { $setWindowFields: { partitionBy: "$rated", sortBy: { runtime: 1 }, output: { runtimeFromSimilarMovies: { $sum: "$runtime", window: { range: [ -10, 10 ] } } } } }] )[ { rated: 'G', title: 'Toy Story', runtime: 81, runtimeFromSimilarMovies: 81 }, { rated: 'PG', title: 'Little Women', runtime: 115, runtimeFromSimilarMovies: 115 }, { rated: 'PG-13', title: 'King of the Hill', runtime: 103, runtimeFromSimilarMovies: 103 }, { rated: 'PG-13', title: 'The Fugitive', runtime: 130, runtimeFromSimilarMovies: 263 }, { runtime: 133, rated: 'PG-13', title: 'Quiz Show', runtimeFromSimilarMovies: 263 }, { rated: 'PG-13', title: 'Hoop Dreams', runtime: 170, runtimeFromSimilarMovies: 170 }, { rated: 'R', title: 'To Die For', runtime: 106, runtimeFromSimilarMovies: 106 }, { runtime: 119, title: 'Crumb', rated: 'R', runtimeFromSimilarMovies: 240 }, { runtime: 121, rated: 'R', title: 'The Piano', runtimeFromSimilarMovies: 240 }, { rated: 'R', title: 'Pulp Fiction', runtime: 154, runtimeFromSimilarMovies: 154 }, { runtime: 195, rated: 'R', title: "Schindler's List", runtimeFromSimilarMovies: 195 }]No exemplo:
partitionBy: "$rated"particiona os documentos na collection porrated. As partições sãoG,PG,PG-13eR.sortBy: { runtime: 1 }ordena os documentos em cada partição porruntimeem ordem crescente (1), de modo que oruntimemais curto seja o primeiro.outputdefine o camporuntimeFromSimilarMoviescomo a soma dos valoresruntimedos documentos em uma janela de faixa.
Exemplos de janelas de faixa de tempo
Usar uma janela de faixa de tempo com um limite superior positivo
O exemplo seguinte utiliza uma janela com uma unidade de faixa de tempo de limite superior positivo em $setWindowFields. O pipeline gera uma array de valores released para cada valor rated que correspondem à faixa de tempo especificada. Na saída do exemplo , o campo recentReleases mostra a array de valores released.
db.movies.aggregate( [ { $match: { metacritic: { $gt: 85 }, year: { $gte: 1993, $lte: 1995 } } }, { $project: { _id: 0, title: 1, rated: 1, released: 1 } }, { $setWindowFields: { partitionBy: "$rated", sortBy: { released: 1 }, output: { recentReleases: { $push: "$released", window: { range: [ "unbounded", 10 ], unit: "month" } } } } }] )[ { rated: 'G', title: 'Toy Story', released: ISODate('1995-11-22T00:00:00.000Z'), recentReleases: [ ISODate('1995-11-22T00:00:00.000Z') ] }, { rated: 'PG', title: 'Little Women', released: ISODate('1994-12-25T00:00:00.000Z'), recentReleases: [ ISODate('1994-12-25T00:00:00.000Z') ] }, { rated: 'PG-13', title: 'The Fugitive', released: ISODate('1993-08-06T00:00:00.000Z'), recentReleases: [ ISODate('1993-08-06T00:00:00.000Z'), ISODate('1993-08-20T00:00:00.000Z') ] }, { rated: 'PG-13', title: 'King of the Hill', released: ISODate('1993-08-20T00:00:00.000Z'), recentReleases: [ ISODate('1993-08-06T00:00:00.000Z'), ISODate('1993-08-20T00:00:00.000Z') ] }, { rated: 'PG-13', title: 'Quiz Show', released: ISODate('1994-10-07T00:00:00.000Z'), recentReleases: [ ISODate('1993-08-06T00:00:00.000Z'), ISODate('1993-08-20T00:00:00.000Z'), ISODate('1994-10-07T00:00:00.000Z'), ISODate('1994-10-14T00:00:00.000Z') ] }, { rated: 'PG-13', title: 'Hoop Dreams', released: ISODate('1994-10-14T00:00:00.000Z'), recentReleases: [ ISODate('1993-08-06T00:00:00.000Z'), ISODate('1993-08-20T00:00:00.000Z'), ISODate('1994-10-07T00:00:00.000Z'), ISODate('1994-10-14T00:00:00.000Z') ] }, { rated: 'R', title: "Schindler's List", released: ISODate('1994-02-04T00:00:00.000Z'), recentReleases: [ ISODate('1994-02-04T00:00:00.000Z'), ISODate('1994-02-11T00:00:00.000Z'), ISODate('1994-10-14T00:00:00.000Z') ] }, { rated: 'R', title: 'The Piano', released: ISODate('1994-02-11T00:00:00.000Z'), recentReleases: [ ISODate('1994-02-04T00:00:00.000Z'), ISODate('1994-02-11T00:00:00.000Z'), ISODate('1994-10-14T00:00:00.000Z') ] }, { rated: 'R', title: 'Pulp Fiction', released: ISODate('1994-10-14T00:00:00.000Z'), recentReleases: [ ISODate('1994-02-04T00:00:00.000Z'), ISODate('1994-02-11T00:00:00.000Z'), ISODate('1994-10-14T00:00:00.000Z'), ISODate('1995-04-28T00:00:00.000Z') ] }, { title: 'Crumb', released: ISODate('1995-04-28T00:00:00.000Z'), rated: 'R', recentReleases: [ ISODate('1994-02-04T00:00:00.000Z'), ISODate('1994-02-11T00:00:00.000Z'), ISODate('1994-10-14T00:00:00.000Z'), ISODate('1995-04-28T00:00:00.000Z'), ISODate('1995-10-06T00:00:00.000Z') ] }, { rated: 'R', title: 'To Die For', released: ISODate('1995-10-06T00:00:00.000Z'), recentReleases: [ ISODate('1994-02-04T00:00:00.000Z'), ISODate('1994-02-11T00:00:00.000Z'), ISODate('1994-10-14T00:00:00.000Z'), ISODate('1995-04-28T00:00:00.000Z'), ISODate('1995-10-06T00:00:00.000Z') ] }]No exemplo:
partitionBy: "$rated"particiona os documentos na collection porrated. As partições sãoG,PG,PG-13eR.sortBy: { released: 1 }ordena os documentos em cada partição porreleasedem ordem crescente (1), de modo que a datareleasedmais antiga seja a primeira.
$pushretorna a array de valoresreleasedpara os documentos entre o início da partição e os documentos com valoresreleasedinclusive em uma faixa do valorreleaseddo documento atual mais10meses.
Usar uma janela de faixa de tempo com limite superior negativo
O exemplo seguinte utiliza uma janela com uma unidade de faixa de tempo de limite superior negativo em $setWindowFields. O pipeline gera uma array de valores released para cada valor rated que correspondem à faixa de tempo especificada. Na saída do exemplo , o campo recentReleases mostra a array de valores released.
db.movies.aggregate( [ { $match: { metacritic: { $gt: 85 }, year: { $gte: 1993, $lte: 1995 } } }, { $project: { _id: 0, title: 1, rated: 1, released: 1 } }, { $setWindowFields: { partitionBy: "$rated", sortBy: { released: 1 }, output: { recentReleases: { $push: "$released", window: { range: [ "unbounded", -10 ], unit: "month" } } } } }] )[ { rated: 'G', title: 'Toy Story', released: ISODate('1995-11-22T00:00:00.000Z'), recentReleases: [] }, { rated: 'PG', title: 'Little Women', released: ISODate('1994-12-25T00:00:00.000Z'), recentReleases: [] }, { rated: 'PG-13', title: 'The Fugitive', released: ISODate('1993-08-06T00:00:00.000Z'), recentReleases: [] }, { rated: 'PG-13', title: 'King of the Hill', released: ISODate('1993-08-20T00:00:00.000Z'), recentReleases: [] }, { rated: 'PG-13', title: 'Quiz Show', released: ISODate('1994-10-07T00:00:00.000Z'), recentReleases: [ ISODate('1993-08-06T00:00:00.000Z'), ISODate('1993-08-20T00:00:00.000Z') ] }, { rated: 'PG-13', title: 'Hoop Dreams', released: ISODate('1994-10-14T00:00:00.000Z'), recentReleases: [ ISODate('1993-08-06T00:00:00.000Z'), ISODate('1993-08-20T00:00:00.000Z') ] }, { rated: 'R', title: "Schindler's List", released: ISODate('1994-02-04T00:00:00.000Z'), recentReleases: [] }, { rated: 'R', title: 'The Piano', released: ISODate('1994-02-11T00:00:00.000Z'), recentReleases: [] }, { rated: 'R', title: 'Pulp Fiction', released: ISODate('1994-10-14T00:00:00.000Z'), recentReleases: [] }, { title: 'Crumb', released: ISODate('1995-04-28T00:00:00.000Z'), rated: 'R', recentReleases: [ ISODate('1994-02-04T00:00:00.000Z'), ISODate('1994-02-11T00:00:00.000Z') ] }, { rated: 'R', title: 'To Die For', released: ISODate('1995-10-06T00:00:00.000Z'), recentReleases: [ ISODate('1994-02-04T00:00:00.000Z'), ISODate('1994-02-11T00:00:00.000Z'), ISODate('1994-10-14T00:00:00.000Z') ] }]No exemplo:
partitionBy: "$rated"particiona os documentos na collection porrated. As partições sãoG,PG,PG-13eR.sortBy: { released: 1 }ordena os documentos em cada partição porreleasedem ordem crescente (1), de modo que a datareleasedmais antiga seja a primeira.
$pushretorna a array dereleasedvalores para os documentos entre o início da partição e os documentos com valoresreleasedinclusive em uma faixa do valorreleaseddo documento atual menos10meses.
Exemplo de comparação com valores anteriores
O exemplo a seguir usa $setWindowFields com o operador $shift e o estágio $set para comparar campos em uma coleção. Na saída do exemplo, o campo runtimeComparison mostra o resultado da comparação.
db.movies.aggregate( [ { $match: { metacritic: { $gt: 85 }, year: { $gte: 1993, $lte: 1995 } } }, { $project: { _id: 0, title: 1, rated: 1, released: 1, runtime: 1 } }, { $setWindowFields: { partitionBy: "$rated", sortBy: { released: 1 }, output: { previousRuntime: { $shift: { output: "$runtime", by: -1 } } } } }, { $set: { runtimeComparison: { $cond: [ { $eq: ["$runtime", "$previousRuntime"] }, "same", { $cond: [ { $gt: ["$runtime", "$previousRuntime"] }, "longer", "shorter" ] } ] } } },] )[ { rated: 'G', title: 'Toy Story', released: ISODate('1995-11-22T00:00:00.000Z'), runtime: 81, previousRuntime: null, runtimeComparison: 'longer' }, { rated: 'PG', title: 'Little Women', released: ISODate('1994-12-25T00:00:00.000Z'), runtime: 115, previousRuntime: null, runtimeComparison: 'longer' }, { rated: 'PG-13', title: 'The Fugitive', released: ISODate('1993-08-06T00:00:00.000Z'), runtime: 130, previousRuntime: null, runtimeComparison: 'longer' }, { rated: 'PG-13', title: 'King of the Hill', released: ISODate('1993-08-20T00:00:00.000Z'), runtime: 103, previousRuntime: 130, runtimeComparison: 'shorter' }, { runtime: 133, rated: 'PG-13', title: 'Quiz Show', released: ISODate('1994-10-07T00:00:00.000Z'), previousRuntime: 103, runtimeComparison: 'longer' }, { rated: 'PG-13', title: 'Hoop Dreams', released: ISODate('1994-10-14T00:00:00.000Z'), runtime: 170, previousRuntime: 133, runtimeComparison: 'longer' }, { runtime: 195, rated: 'R', title: "Schindler's List", released: ISODate('1994-02-04T00:00:00.000Z'), previousRuntime: null, runtimeComparison: 'longer' }, { runtime: 121, rated: 'R', title: 'The Piano', released: ISODate('1994-02-11T00:00:00.000Z'), previousRuntime: 195, runtimeComparison: 'shorter' }, { rated: 'R', title: 'Pulp Fiction', released: ISODate('1994-10-14T00:00:00.000Z'), runtime: 154, previousRuntime: 121, runtimeComparison: 'longer' }, { runtime: 119, title: 'Crumb', released: ISODate('1995-04-28T00:00:00.000Z'), rated: 'R', previousRuntime: 154, runtimeComparison: 'shorter' }, { rated: 'R', title: 'To Die For', released: ISODate('1995-10-06T00:00:00.000Z'), runtime: 106, previousRuntime: 119, runtimeComparison: 'shorter' }]No exemplo:
partitionBy: "$rated"particiona os documentos na collection porratedpara que os cálculos de cada classificação sejam mantidos separados.sortBy: { released: 1 }classifica os documentos em cada partição porreleasedem ordem crescente1().output.previousRuntimeusa o operador$shiftpara capturar oruntimedo filme imediatamente anterior dentro da mesma classificação.$setadiciona um novo campo chamadoruntimeComparisone define o valor desse campo comolonger,shorterousamecom base na comparação compreviousRuntime.
A seguinte classe WeatherMeasurement representa documentos em uma coleção de medições meteorológicas:
[BsonIgnoreExtraElements]public class WeatherMeasurement{ [BsonId] public ObjectId Id { get; set; } [BsonElement("localityId")] public string LocalityId { get; set; } = null!; [BsonElement("measurementDateTime")] public DateTime MeasurementDateTime { get; set; } [BsonElement("rainfall")] public float Rainfall { get; set; } [BsonElement("temperature")] public float Temperature { get; set; }}Para usar o driver MongoDB .NET/C# para adicionar um estágio $setWindowFields a uma agregação pipeline, chame o método UnionWith() em um objeto PipelineDefinition.
O exemplo a seguir cria um estágio de pipeline que usa os campos Rainfall e Temperature para calcular a precipitação acumulada, a temperatura média móvel, a temperatura mediana e o 90º percentil de precipitação no mês passado para cada localidade:
var pipeline = new EmptyPipelineDefinition<WeatherMeasurement>() .SetWindowFields( partitionBy: w => w.LocalityId, sortBy: Builders<WeatherMeasurement>.Sort.Ascending( w => w.MeasurementDateTime), output: o => new { MonthlyRainfall = o.Sum( w => w.Rainfall, RangeWindow.Create( RangeWindow.Months(-1), RangeWindow.Current) ), TemperatureAvg = o.Average( w => w.Temperature, RangeWindow.Create( RangeWindow.Months(-1), RangeWindow.Current) ), MedianTemperature = o.Median( w => w.Temperature, RangeWindow.Create( RangeWindow.Months(-1), RangeWindow.Current) ), NinetiethPercentileRainfall = o.Percentile( w => w.Rainfall, new[] { 0.9 }, RangeWindow.Create( RangeWindow.Months(-1), RangeWindow.Current) ) } );Os exemplos de Node.js nesta página usam a coleção sample_weatherdata.data dos conjuntos de dados de amostra do Atlas. Para aprender como criar um cluster gratuito do MongoDB Atlas e carregar os conjuntos de dados de amostra, consulte Introdução na documentação do driver MongoDB Node.js.
Para usar o driver Node.js do MongoDB para adicionar um estágio $setWindowFields a um pipeline de agregação , use o operador $setWindowFields em um objeto de pipeline.
O exemplo a seguir cria um estágio de pipeline que calcula a média de airTemperature.value e o total de waveMeasurement.waves.height para cada valor único de callLetters no último mês. O exemplo em seguida executa o pipeline de agregação:
const pipeline = [ { $setWindowFields: { partitionBy: "$callLetters", sortBy: { ts: 1 }, output: { temperatureAvg: { $avg: "$airTemperature.value", window: { range: [-1, "current"], unit: "month" } }, totalWaveHeight: { $sum: "$waveMeasurement.waves.height", window: { range: [-1, "current"], unit: "month" } } } } },];
const cursor = collection.aggregate(pipeline);return cursor;Dica
Para obter um exemplo adicional sobre o consumo de energia IOT, consulte o e-book Aggregations práticas do MongoDB.