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

Transforme seus dados com agregação

Nesta página

  • Visão geral
  • Comparar agregação e encontrar operações
  • Limitações
  • Executar operações de agregação
  • Filtrar, agrupar e contar documentos
  • Explicar uma agregação
  • Executar uma pesquisa de texto completo do Atlas
  • Métodos de auxiliar do operador de pesquisa
  • Informações adicionais
  • Manual do MongoDB Server
  • Documentação da API

Neste guia, você pode aprender como usar o driver Scala para executar operações de agregação.

Operações de aggregation processam dados em suas collections MongoDB e retornam resultados calculados. A estrutura de agregação MongoDB, que faz parte da API de query, é modelada sobre o conceito de pipelines de processamento de dados. Os documentos entram em um pipeline que contém um ou mais estágios, e esse pipeline transforma os documentos em um resultado agregado.

Uma operação de agregação é semelhante a uma fábrica de carros. Uma fábrica de automóveis tem uma linha de montagem, que contém estações de montagem com ferramentas especializadas para realizar trabalhos específicos, como furadeiras e soldadores. As peças brutas entram na fábrica e, em seguida, a linha de montagem transforma e as monta em um produto acabado.

O pipeline de agregação é a linha de montagem, estágios de agregação são as estações de montagem e expressões do operador são as ferramentas especializadas.

A tabela a seguir lista as diferentes tarefas que as operações de localização podem executar e as compara com o que as operações de agregação podem executar. A framework de agregação oferece funcionalidade expandida que permite transformar e manipular seus dados.

Encontrar operações
Operações de agregação
Select certain documents to return
Select which fields to return
Sort the results
Limit the results
Count the results
Select certain documents to return
Select which fields to return
Sort the results
Limit the results
Count the results
Rename fields
Compute new fields
Summarize data
Connect and merge data sets

Considere as seguintes limitações ao realizar operações de agregação:

  • Os documentos devolvidos não podem violar olimite de tamanho do documento BSON de 16 megabytes.

  • Os estágios do pipeline têm um limite de memória de 100 megabytes por padrão. Você pode exceder esse limite passando um valor de true para o método allowDiskUse() e vinculando o método a aggregate().

  • O operador $graphLookup tem um limite de memória rigoroso de 100 megabytes e ignora o valor passado para o allowDiskUse() método.

Observação

Dados de amostra

Os exemplos neste guia usam a collection restaurants no banco de dados sample_restaurants dos conjuntos de banco de dados de amostra do Atlas. Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o guia Iniciar com Atlas .

Para executar uma agregação, passe uma lista contendo os estágios do pipeline para o método aggregate(). O driver Scala fornece a classe Aggregates , que inclui métodos de assistente para criar estágios de pipeline.

Para saber mais sobre os estágios do pipeline e seus métodos assistente Aggregates correspondentes, consulte os seguintes recursos:

Este exemplo de código produz uma contagem do número de padarias em cada bairro de Nova York. Para fazer isso, ele chama o método aggregate() e passa um pipeline de agregação como uma lista de estágios. O código cria esses estágios usando os seguintes métodos de assistente Aggregates:

  • filter(): cria o estágio $match para filtrar documentos que tenham um cuisine valor de "Bakery"

  • group(): Constrói o estágio $group para agrupar os documentos correspondentes pelo borough campo , acumulando uma contagem de documentos para cada valor distinto

val pipeline = Seq(Aggregates.filter(Filters.equal("cuisine", "Bakery")),
Aggregates.group("$borough", Accumulators.sum("count", 1))
)
collection.aggregate(pipeline)
.subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"_id": "Brooklyn", "count": 173}
{"_id": "Queens", "count": 204}
{"_id": "Bronx", "count": 71}
{"_id": "Staten Island", "count": 20}
{"_id": "Missing", "count": 2}
{"_id": "Manhattan", "count": 221}

Para visualizar informações sobre como o MongoDB executa sua operação, você pode instruir o planejador de query do MongoDB a explicá-la. Quando o MongoDB explica uma operação, ele retorna planos de execução e estatísticas de desempenho. Um plano de execução é uma maneira em potencial da qual o MongoDB pode concluir uma operação. Quando você instrui o MongoDB a explicar uma operação, ele retorna o plano executado MongoDB e quaisquer planos de execução rejeitados por padrão.

Para explicar uma operação de agregação , encadeie o método explain() ao método aggregate(). Você pode passar um nível de verbosidade para explain(), que modifica o tipo e a quantidade de informações que o método retorna. Para obter mais informações sobre verbosidade, consulte Modos de verbosidade no manual do MongoDB Server .

O exemplo a seguir instrui o MongoDB a explicar a operação de agregação do exemplo anterior de documentos de filtro, grupo e contagem. O código passa um valor de verbosidade de ExplainVerbosity.EXECUTION_STATS para o método explain(), que configura o método para retornar estatísticas que descrevem a execução do plano vencedor:

val pipelineToExplain = Seq(Aggregates.filter(Filters.equal("cuisine", "Bakery")),
Aggregates.group("$borough", Accumulators.sum("count", 1))
)
collection.aggregate(pipelineToExplain)
.explain(ExplainVerbosity.EXECUTION_STATS)
.subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"explainVersion": "2", "queryPlanner": {"namespace": "sample_restaurants.restaurants",
"indexFilterSet": false, "parsedQuery": {"cuisine": {"$eq": "Bakery"}}, "queryHash": "865F14C3",
"planCacheKey": "0FC225DA", "optimizedPipeline": true, "maxIndexedOrSolutionsReached": false,
"maxIndexedAndSolutionsReached": false, "maxScansToExplodeReached": false, "winningPlan":
{"queryPlan": {"stage": "GROUP", "planNodeId": 3, "inputStage": {"stage": "COLLSCAN",
"planNodeId": 1, "filter": {"cuisine": {"$eq": "Bakery"}}, "direction": "forward"}},
...}

Dica

Disponível apenas no Atlas para MongoDB v4.2 e posterior

Esse operador de pipeline de agregação só está disponível para coleções hospedadas em clusters do MongoDB Atlas 4.2 que executam v ou posterior que são abrangidos por um índice do Atlas Search .

Para especificar uma pesquisa de texto completo de um ou mais campos, você pode criar um estágio de pipeline $search. O driver Scala fornece o método assistente Aggregates.search() para criar esse estágio. O método search() exige os seguintes argumentos:

  • SearchOperator instância: especifica o campo e o texto a serem pesquisados.

  • SearchOptions instância: especifica opções para personalizar a pesquisa de texto completo. Você deve definir a opção index para o nome do índice do Atlas Search a ser usado.

Este exemplo cria estágios de pipeline para executar as seguintes ações:

  • Pesquise no campo name texto que contenha a palavra "Salt"

  • Projete somente os valores _id e name de documentos correspondentes

val operator = SearchOperator.text(SearchPath.fieldPath("name"), "Salt")
val options = searchOptions().index("<search index name>")
val pipeline = Seq(Aggregates.search(operator, options),
Aggregates.project(Projections.include("name")))
collection.aggregate(pipeline)
.subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"_id": {"$oid": "..."}, "name": "Fresh Salt"}
{"_id": {"$oid": "..."}, "name": "Salt & Pepper"}
{"_id": {"$oid": "..."}, "name": "Salt + Charcoal"}
{"_id": {"$oid": "..."}, "name": "A Salt & Battery"}
{"_id": {"$oid": "..."}, "name": "Salt And Fat"}
{"_id": {"$oid": "..."}, "name": "Salt And Pepper Diner"}

Importante

Para executar o exemplo anterior, você deve criar um índice do Atlas Search na collection restaurants que cubra o campo name. Em seguida, substitua o espaço reservado "<search index name>" pelo nome do índice. Para saber mais sobre os índices do Atlas Search , consulte o guia Índices do Atlas Search .

O driver Scala fornece métodos de assistente para os seguintes operadores:

Operador
Descrição

Executa uma pesquisa por uma palavra ou frase que contém uma sequência de caracteres de uma string de entrada incompleta.

Combina dois ou mais operadores em uma única query.

Verifica se um campo corresponde a um valor que você especificou. Mapeia para os métodos equals() e equalsNull()

Testa se existe um caminho para um nome de campo indexado especificado em um documento.

Executa uma pesquisa por uma array de valores de número BSON, data, boolean, objectId, uuid ou string no caminho fornecido e retorna documentos em que o valor do campo é igual a qualquer valor na array especificada.

Retorna documentos semelhantes aos documentos de entrada.

Suporta a consulta e pontuação de valores numéricos, de data e de ponto GeoJSON .

Executa uma pesquisa de documentos contendo uma sequência ordenada de termos usando o analisador especificado na configuração do índice.

Suporta a realização de query de uma combinação de campos e valores indexados.

Suporta a consulta e pontuação de valores numéricos, de data e de cadeia de caracteres. Mapeia para os métodos numberRange() e dateRange()

Interpreta o campo de query como uma expressão regular.

Executa uma pesquisa de texto completo usando o analisador especificado na configuração do índice.

Habilita queries que usam caracteres especiais na string de pesquisa que podem corresponder a qualquer caractere.

Observação

Conjunto de Dados de Amostra do Atlas

Este exemplo utiliza a collection sample_mflix.movies a partir do conjunto de dados de amostra do Atlas. Para saber como configurar um Atlas cluster de camada grátis e carregar o conjunto de dados de amostra, consulte o tutorial Introdução ao Atlas na documentação do Atlas.

Antes de executar este exemplo, você deve criar um índice do Atlas Search na coleção movies que tenha a seguinte definição:

{
"mappings": {
"dynamic": true,
"fields": {
"title": {
"analyzer": "lucene.keyword",
"type": "string"
},
"genres": {
"normalizer": "lowercase",
"type": "token"
}
}
}
}

Para saber mais sobre como criar índices de Atlas Search, consulte o guia Índices de Atlas Search.

O seguinte código cria um estágio $search que tem as seguintes especificações:

  • Verifica se a array genres inclui "Comedy"

  • Pesquisa no campo fullplot a frase "new york"

  • Corresponde a year valores entre 1950 e 2000, inclusive

  • Pesquisa title valores que começam com o termo "Love"

val searchStage = Aggregates.search(
SearchOperator.compound()
.must(
Iterable(
SearchOperator.in(fieldPath("genres"), List("Comedy")),
SearchOperator.phrase(fieldPath("fullplot"), "new york"),
SearchOperator.numberRange(fieldPath("year")).gtLt(1950, 2000),
SearchOperator.wildcard("Love *", fieldPath("title")),
).asJava
)
)
val projectStage = Aggregates.project(
Projections.include("title", "year", "genres"))
val aggregatePipelineStages = Seq(searchStage, projectStage)
collection.aggregate(aggregatePipelineStages)
.subscribe((doc: Document) => println(doc.toJson()),
(e: Throwable) => println(s"There was an error: $e"))
{"_id": ..., "genres": ["Comedy", "Romance"], "title": "Love at First Bite", "year": 1979}
{"_id": ..., "genres": ["Comedy", "Drama"], "title": "Love Affair", "year": 1994}

Para saber mais sobre os métodos assistente do Atlas Search, consulte a referência da interface SearchOperator na documentação da API Driver Core.

Para saber mais sobre os tópicos discutidos neste guia, consulte as seguintes páginas no manual do MongoDB Server :

Para saber mais sobre os métodos e tipos discutidos neste guia, consulte a seguinte documentação da API:

Voltar

Monitoramento de clusters