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

Transforme seus dados com agregação

Neste guia, você pode aprender como usar o driver Ruby 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.

Dica

Tutoriais completos de agregação

Você pode encontrar tutoriais que fornecem explicações detalhadas de tarefas comuns de agregação na seção Tutoriais completos do aggregation pipeline do manual do servidor. Selecione um tutorial e escolha Ruby no Select your language menu suspenso no canto superior direito da página.

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 o limite 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 allow_disk_use 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 allow_disk_use 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, defina cada estágio de pipeline como Ruby hash e, em seguida, passe o pipeline de operações para o método aggregate.

O exemplo de código a seguir produz uma contagem do número de padarias em cada bairro de Nova York. Para fazer isso, ele usa um pipeline de agregação com os seguintes estágios:

  • Um estágio $match para filtrar os documentos cujo campo cuisine contém o valor "Bakery".

  • Um estágio $group para agrupar os documentos correspondentes pelo campo borough , acumulando uma contagem de documentos para cada valor distinto.

database = client.use('sample_restaurants')
restaurants_collection = database[:restaurants]
pipeline = [
{ '$match' => { 'cuisine' => 'Bakery' } },
{ '$group' => {
'_id' => '$borough',
'count' => { '$sum' => 1 }
}
}
]
aggregation = restaurants_collection.aggregate(pipeline)
aggregation.each do |doc|
puts doc
end
{"_id"=>"Bronx", "count"=>71}
{"_id"=>"Manhattan", "count"=>221}
{"_id"=>"Queens", "count"=>204}
{"_id"=>"Missing", "count"=>2}
{"_id"=>"Staten Island", "count"=>20}
{"_id"=>"Brooklyn", "count"=>173}

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.

O exemplo a seguir instrui o MongoDB a explicar a operação de agregação do Exemplo de agregação anterior:

explanation = restaurants_collection.aggregate(pipeline).explain()
puts explanation
{"explainVersion"=>"2", "queryPlanner"=>{"namespace"=>"sample_restaurants.restaurants",
"parsedQuery"=>{"cuisine"=> {"$eq"=> "Bakery"}}, "indexFilterSet"=>false,
"planCacheKey"=>"6104204B", "optimizedPipeline"=>true, "maxIndexedOrSolutionsReached"=>false,
"maxIndexedAndSolutionsReached"=>false, "maxScansToExplodeReached"=>false,
"prunedSimilarIndexes"=>false, "winningPlan"=>{"isCached"=>false,
"queryPlan"=>{"stage"=>"GROUP", "planNodeId"=>3,
"inputStage"=>{"stage"=>"COLLSCAN", "planNodeId"=>1, "filter"=>{},
"direction"=>"forward"}},...}

Observação

Disponível apenas para collections com um índice do Atlas Search

Esse operador de pipeline de agregação só está disponível para coleções com 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.

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

  • Pesquise no campo name o termo "Salt"

  • Projete apenas os valores _id e name de documentos correspondentes

Importante

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

search_pipeline = [
{
'$search' => {
'index' => '<your_search_index_name>',
'text' => {
'query' => 'Salt',
'path' => 'name'
},
}
},
{
'$project' => {
'_id' => 1,
'name' => 1
}
}
]
results = collection.aggregate(search_pipeline)
results.each do |document|
puts document
end
{"_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"}

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 de agregação do driver Ruby, consulte a documentação da API para Agregação.

Voltar

Monitoramento de clusters

Nesta página