Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.

$setWindowFields (estágio de agregação )

$setWindowFields

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.

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 $setWindowFields, o grupo de documentos é conhecido como uma partição. O padrão é uma partição para toda a coleção.

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 $sort. O padrão não está classificando.

Obrigatório

Especifica o(s) campo(s) a ser(em) anexado(s) aos documentos no resultado retornado pelo estágio $setWindowFields. Cada campo é definido como o resultado retornado pelo operador de blocos.

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 $setWindowFields é a mesma dos estágios $addFields e $set. Consulte exemplo de documento incorporado $addFields e exemplo de documento incorporado $set.

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:

  • A string "current" para a posição atual do documento no resultado.

  • A string "unbounded" para a posição do primeiro ou último documento na partição.

  • Um número inteiro para uma posição relativa ao documento atual. Use um número inteiro negativo para uma posição antes do documento atual. Use um número inteiro positivo para uma posição após o documento atual. 0 é a posição atual do documento.

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:

  • A string "current" para a posição atual do documento no resultado.

  • A string "unbounded" para a posição do primeiro ou último documento na partição.

  • Um número a ser adicionado ao valor do campo sortBy do documento atual. Um documento estará na janela se o valor do campo sortBy estiver inclusive dentro dos limites inferior e superior.

Consulte Exemplo de janela de faixa.

Opcional

Especifica as unidades para os limites da janela de faixa de tempo. Pode-se definir como uma destas strings:

  • "year"

  • "quarter"

  • "month"

  • "week"

  • "day"

  • "hour"

  • "minute"

  • "second"

  • "millisecond"

No caso de omissão, os limites numéricos padrão da janela de faixa serão usados.

Consulte Exemplos de janela de faixa de tempo.

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.

Esses operadores podem ser utilizados com o estágio $setWindowFields:

Restrições para o estágio $setWindowFields:

  • Antes do MongoDB 5.3, o estágio $setWindowFields não pode ser usado:

  • sortBy é necessário para:

  • As janelas de faixa exigem que todos os valores sortBy sejam números.

  • 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:

  • No caso das janelas de faixa, somente números na faixa especificada são incluídos na janela. Valores ausentes, indefinidos e null sã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 $sum em strings), o valor retornado depende do operador:

    • Para $count e $sum, o valor retornado é 0.

    • Para $addToSet e $push, o valor retornado é uma array vazia.

    • Para todos os outros operadores, o valor retornado é null.

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.

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 por rated. As partições são G, PG, PG-13 e R.

  • sortBy: { released: 1 } ordena os documentos em cada partição por released em ordem crescente (1), de modo que a data released mais antiga seja a primeira.

  • output:

    • Define o campo cumulativeRuntimeForRating para o runtime cumulativo para cada valor rated, que aumenta sucessivamente ao valor anterior na partição.

    • Calcula o runtime cumulativo utilizando o operador $sum executado em uma janela de documentos.

      A janela contém documentos entre um limite inferior unbounded e o documento current. Isso significa que $sum retorna a runtime cumulativa dos documentos entre o início da partição e o documento atual.

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:

  • partitionBy: { $year: "$released" } divide os documentos na coleção por $year em released. Existem partições para 1993, 1994 e 1995.

  • sortBy: { released: 1 } ordena os documentos em cada partição por released em ordem crescente (1), de modo que a data released mais antiga seja a primeira.

  • output:

    • Define o campo cumulativeRuntimeForYear para o runtime cumulativo para cada ano, que aumenta sucessivamente o valor anterior na partição.

    • Calcula o runtime cumulativo utilizando o operador $sum executado em uma janela de documentos.

      A janela contém documentos entre um limite inferior unbounded e o documento current. Isso significa que $sum retorna a runtime cumulativa dos documentos entre o início da partição e o documento atual.

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:

  • partitionBy: { $year: "$released" } divide os documentos na coleção por $year em released. Existem partições para 1993, 1994 e 1995.

  • sortBy: { released: 1 } ordena os documentos em cada partição por released em ordem crescente (1), de modo que a data released mais antiga seja a primeira.

  • output:

    • Define o campo averageRuntime para a média móvel runtime para cada ano.

    • Calcula a média móvel runtime utilizando o operador $avg executado em uma janela de documentos.

      A janela contém documentos entre -1 e 0. Isso significa que $avg retorna a média móvel runtime entre o documento antes do documento atual (-1) e o documento atual (0) na partição.

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:

  • partitionBy: { $year: "$released" } divide os documentos na coleção por $year em released. Existem partições para 1993, 1994 e 1995.

  • sortBy: { released: 1 } ordena os documentos em cada partição por released em ordem crescente (1), de modo que a data released mais antiga seja a primeira.

  • output:

    • Define o campo cumulativeRuntimeForYear como runtime cumulativo para cada ano.

    • Calcula o runtime cumulativo utilizando o operador $sum executado em uma janela de documentos.

      A janela contém documentos entre um limite inferior unbounded e o documento current. Isso significa que $sum retorna a runtime cumulativa dos documentos entre o início da partição e o documento atual.

    • Define o campo maximumRuntimeForYear para a runtime máxima para cada ano.

    • Calcula a runtime máxima de todos os documentos usando o operador $max executado em uma janela de documentos.

      A janela contém documentos entre um limite unbounded inferior e upper. Isso significa que $max retorna o runtime máximo para os documentos na partição.

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 por rated. As partições são G, PG, PG-13 e R.

  • sortBy: { runtime: 1 } ordena os documentos em cada partição por runtime em ordem crescente (1), de modo que o runtime mais curto seja o primeiro.

  • output define o campo runtimeFromSimilarMovies como a soma dos valores runtime dos documentos em uma janela de faixa.

    • A janela contém documentos entre um limite inferior de -10 e um limite superior de 10. A faixa é inclusiva.

    • $sum retorna a soma de valores runtime contidos em uma faixa de mais ou menos 10 minutos do valor runtime do documento atual.

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 por rated. As partições são G, PG, PG-13 e R.

  • sortBy: { released: 1 } ordena os documentos em cada partição por released em ordem crescente (1), de modo que a data released mais antiga seja a primeira.

  • output:

    • Define o campo recentReleases para uma array de valores released para os documentos em cada partição rated. Os elementos de array são expandidos com adições aos elementos anteriores na array.

    • Usa $push para retornar uma array de valores released dos documentos em uma janela de faixa.

  • A janela contém documentos entre um limite inferior unbounded e um limite superior definido como 10 (10 meses após o valor released do documento atual) usando uma unidade de intervalo de tempo.

  • $push retorna a array de valores released para os documentos entre o início da partição e os documentos com valores released inclusive em uma faixa do valor released do documento atual mais 10 meses.

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 por rated. As partições são G, PG, PG-13 e R.

  • sortBy: { released: 1 } ordena os documentos em cada partição por released em ordem crescente (1), de modo que a data released mais antiga seja a primeira.

  • output:

    • Define o campo recentReleases para uma array de valores released para os documentos em cada partição rated. Os elementos de array são expandidos com adições aos elementos anteriores na array.

    • Usa $push para retornar uma array de valores released dos documentos em uma janela de faixa.

  • A janela contém documentos entre um limite inferior unbounded e um limite superior definido como -10 (10 meses antes do valor released do documento atual) usando uma unidadede intervalo de tempo.

  • $push retorna a array de released valores para os documentos entre o início da partição e os documentos com valores released inclusive em uma faixa do valor released do documento atual menos 10 meses.

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 por rated para que os cálculos de cada classificação sejam mantidos separados.

  • sortBy: { released: 1 } classifica os documentos em cada partição por released em ordem crescente1().

  • output.previousRuntime usa o operador $shift para capturar o runtime do filme imediatamente anterior dentro da mesma classificação.

  • $set adiciona um novo campo chamado runtimeComparison e define o valor desse campo como longer, shorter ou same com base na comparação com previousRuntime.

Dica

Para obter um exemplo adicional sobre o consumo de energia IOT, consulte o e-book Aggregations práticas do MongoDB.