Menu Docs
Página inicial do Docs
/ / /
Scala
/

Agregados

Nesta página

  • corresponder
  • Projeto
  • Campos computados
  • Amostra
  • Sort
  • Ignorar
  • Limite
  • Pesquisa
  • Grupo
  • Unwind
  • DefinirWindowFields
  • Montando um pipeline

Os agregados do A classe fornece métodos de fábrica estáticos que constroem estágios de pipeline de agregação. Cada método retorna uma instância do tipo Bson , que por sua vez pode ser passada para o método MongoCollection.aggregate() .

Você pode importar os métodos da classe Aggregates estaticamente, como mostrado no seguinte código:

import org.mongodb.scala.model.Aggregates._

Os exemplos deste guia pressupõem essa importação estática.

O estágio de pipeline $match passa todos os documentos que correspondem ao filtro especificado para o próximo estágio. Embora o filtro possa ser uma instância de qualquer classe que implemente o Bson, é conveniente usar métodos da classe Filtros .

O exemplo a seguir cria um estágio de pipeline que corresponde a todos os documentos onde o valor de campo author é "Dave":

`match`(equal("author", "Dave"))

Observação

Como match é uma palavra reservada em Scala e deve ser evitada por backtiques, talvez você prefira usar o alias filter() :

filter(equal("author", "Dave"))

O estágio do pipeline $project passa os campos projetados de todos os documentos para o próximo estágio. Embora a projeção possa ser uma instância de qualquer classe que implemente Bson, é conveniente usar métodos da classe Projeções .

O exemplo a seguir cria um estágio de pipeline que exclui o campo _id , mas inclui os campos title e author :

project(fields(include("title", "author"), excludeId()))

O estágio $project também pode projetar campos calculados.

O exemplo a seguir projeta o campo qty em um novo campo chamado quantity. Em outras palavras, ele renomeia o campo:

project(computed("quantity", "$qty"))

O estágio do pipeline $sample seleciona aleatoriamente N documentos dos documentos de entrada. O exemplo seguinte utiliza o método sample() para selecionar aleatoriamente 5 documentos da coleção:

sample(5)

O estágio de pipeline do $sort passa todos os documentos para o próximo estágio, classificados de acordo com os critérios de classificação especificados. Embora os critérios de classificação possam ser uma instância de qualquer classe que implemente Bson, é melhor usar métodos da classe Sorts .

O exemplo a seguir cria um estágio de pipeline que classifica em ordem decrescente de acordo com o valor do campo age e, em seguida, em ordem crescente de acordo com o valor do campo posts:

sort(orderBy(descending("age"), ascending("posts")))

O estágio do pipeline $skip ignora o número especificado de documentos que passam para o estágio e passa os documentos restantes para o próximo estágio.

O exemplo a seguir ignora os primeiros 5 documentos:

skip(5)

O estágio de pipeline do $limit limita o número de documentos passados para o próximo estágio.

O exemplo a seguir limita o número de documentos a 10:

limit(10)

O estágio de pipeline $lookup executa uma junção externa esquerda com outra collection para filtrar documentos da collection unida para processamento.

O exemplo a seguir executa uma junção externa esquerda na collection fromCollection , unindo o campo local ao campo from e saída no campo joinedOutput :

lookup("fromCollection", "local", "from", "joinedOutput")

O estágio de pipeline $group agrupa documentos por alguma expressão especificada e gera um documento para cada agrupamento distinto para o próximo estágio. Um grupo consiste em um _id que especifica a expressão na qual agrupar e zero ou mais acumuladores que são avaliados para cada agrupamento.

Para simplificar a expressão dos acumuladores, o driver inclui um objeto singleton Accumulators com métodos de fábrica para cada um dos acumuladores suportados.

O exemplo a seguir agrupa documentos pelo valor do campo customerId e, para cada grupo, acumula a soma e a média dos valores do campo quantidade nos campos totalQuantity e averageQuantity , respectivamente:

group("$customerId", sum("totalQuantity", "$quantity"), avg("averageQuantity", "$quantity"))

O estágio de pipeline $unwind desconstrói um campo de array a partir dos documentos de entrada para gerar um documento para cada elemento.

O exemplo a seguir gera, para cada documento, um documento para cada elemento da array sizes :

unwind("$sizes")

O exemplo a seguir também inclui quaisquer documentos que tenham valores ausentes ou nulos para o campo sizes ou em que a lista sizes esteja vazia:

unwind("$sizes", UnwindOptions().preserveNullAndEmptyArrays(true))

O exemplo a seguir desenrola a array sizes e também gera o índice da array no campo position :

unwind("$sizes", UnwindOptions().includeArrayIndex("$position"))

O estágio de pipeline $setWindowFields permite usar operadores de janela. Esse estágio particiona os documentos de entrada de forma semelhante ao estágio de pipeline $group, opcionalmente classifica-os, calcula campos nos documentos calculando funções de janela no Windows especificado por função e gera os documentos. Uma janela é um subconjunto de uma partição.

A diferença importante em relação ao estágio de pipeline $group é que os documentos pertencentes à mesma partição ou janela não são dobrados em um único documento.

O driver inclui o objeto singleton WindowedComputations com métodos de fábrica para operadores de janela compatíveis.

O exemplo a seguir calcula a precipitação acumulada e a temperatura média no mês passado para cada localidade a partir de medições mais refinadas apresentadas nos campos rainfall e temperature :

val pastMonth: Window = Windows.timeRange(-1, MongoTimeUnit.MONTH, Windows.Bound.CURRENT)
setWindowFields(Some("$localityId"), Some(Sorts.ascending("measurementDateTime")),
WindowedComputations.sum("monthlyRainfall", "$rainfall", Some(pastMonth)),
WindowedComputations.avg("monthlyAvgTemp", "$temperature", Some(pastMonth)))

Os operadores de pipeline normalmente são combinados em uma lista e passados para o método aggregate() de um MongoCollection:

collection.aggregate(List(filter(equal("author", "Dave")),
group("$customerId", sum("totalQuantity", "$quantity"),
avg("averageQuantity", "$quantity")),
out("authors")))

Voltar

Tipos