Agregados
Nesta página
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.
corresponder
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"))
Projeto
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()))
Campos computados
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"))
Amostra
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)
Sort
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")))
Ignorar
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)
Limite
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)
Pesquisa
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")
Grupo
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"))
Unwind
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"))
DefinirWindowFields
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)))
Montando um pipeline
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")))