Agregação
Operações de framework de aggregation processam registros de dados e retornam resultados calculados. As operações de agregação agrupam valores de vários documentos e podem executar uma variedade de operações nos dados agrupados para gerar um único resultado.
O pipeline de agregação
O aggregation pipeline é uma framework para aggregation de dados modelada sobre o conceito de pipelines de processamento de dados. Os documentos entram em um pipeline em várias etapas que transforma os documentos em resultados agregados.
Para obter uma explicação completa e uma lista completa de estágios e operadores de pipeline, consulte o manual.
O exemplo a seguir usa o aggregation pipeline no conjunto de dados de amostra restaurants
para localizar uma lista do número total de restaurantes 5 estrelas, agrupados por categoria de restaurante.
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test') coll = client['restaurants'] aggregation = coll.aggregate([ { '$match'=> { 'stars'=> 5 } }, { '$unwind'=> '$categories'}, { '$group'=> { '_id'=> '$categories', 'fiveStars'=> { '$sum'=> 1 } } } ]) aggregation.each do |doc| #=> Yields a BSON::Document. end
Dentro do método aggregate
, o primeiro estágio do pipeline filtra todos os documentos, exceto aqueles com 5
no campo stars
. O segundo estágio desenrola o campo categories
, que é uma array, e trata cada item na array como um documento separado. O terceiro estágio agrupa os documentos por categoria e adiciona o número de resultados de 5 estrelas correspondentes.
Os estágios do aggregation pipeline têm um limite máximo de uso de memória. Para lidar com grandes conjuntos de dados, defina a opção allowDiskUse
como true para permitir a gravação de dados em arquivos temporários.
Você pode chamar o
allow_disk_use
métodoaggregation
objeto para obter um novo objeto com o conjunto de opções:
aggregation = coll.aggregate([ <aggregration pipeline expressions> ]) aggregation_with_disk_use = aggregation.allow_disk_use(true)
Ou você pode passar uma opção para o método
aggregate
:
aggregation = coll.aggregate([ <aggregration pipeline expressions> ], :allow_disk_use => true)
Operações de agregação de finalidade única
O MongoDB fornece métodos auxiliares para algumas funções de agregação, incluindo contagem e distinção.
Contar
O exemplo seguinte demonstra como utilizar o método count
para localizar o número total de documentos que têm a array [ 'Chinese', 'Seafood' ]
exata no campo categories
.
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test') coll = client['restaurants'] aggregation = coll.count({ 'categories': [ 'Chinese', 'Seafood' ] }) count = coll.count({ 'categories' => [ 'Chinese', 'Seafood' ] })
Observação
O count
método não é o mesmo que o countDocuments
método e pode não suportar os mesmos filtros. countDocuments
usa o $match
estágio do agregação pipeline para filtrar documentos. Para saber mais sobre as limitações do $match
estágio, consulte Restrições $match no manual do MongoDB Server .
distinto
O método auxiliar do distinct
elimina os resultados que contêm valores e retorna um registro para cada valor único.
O exemplo seguinte retorna uma lista de valores únicos para o campo categories
na collection restaurants
:
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test') coll = client['restaurants'] aggregation = coll.distinct('categories') aggregation.each do |doc| #=> Yields a BSON::Document. end