Transforme seus dados com agregação
Nesta página
- Visão geral
- Comparar agregação e encontrar operações
- Limitações
- APIs de agregação
- Array API
- Exemplo de filtro e grupo
- Explicar uma agregação
- Construtor de agregações
- Exemplo de filtro e grupo
- Exemplo de arrays incorporadas de unwind
- Exemplo de união de igualdade única
- Informações adicionais
- Manual do MongoDB Server
- Atlas Search e Vector Search
- Documentação da API
Visão geral
Neste guia, você pode aprender como usar a biblioteca PHP do MongoDB 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.
Comparar agregação e encontrar operações
Você pode usar encontrar operações para executar as seguintes ações:
Selecione quais documentos devolver
Selecione quais campos retornar
ordenar os resultados
Você pode usar operações de agregação para executar as seguintes ações:
Executar operações de localização
Renomear campos
Calcular campos
Resumir dados
Agrupar valores
Limitações
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 criando uma array de opções que defina a opção
allowDiskUse
comotrue
e passando a array para o métodoMongoDB\Collection::aggregate()
.Importante
exceção $graphLookup
O estágio $graphLookup tem um limite de memória rigoroso de 100 megabytes e ignora a opção
allowDiskUse
.
APIs de agregação
A biblioteca PHP fornece as seguintes APIs para criar pipelines de agregação :
API de array : crie pipelines de agregação passando arrays que especificam os estágios de agregação .
Construtor de agregações: crie pipelines de agregação usando métodos de fábrica para tornar seu aplicação mais seguro para o tipo e depuração.
As seções a seguir descrevem cada API e fornecem exemplos para criar pipelines de agregação .
Array API
Para executar uma agregação, passe uma array contendo os estágios do pipeline como documentos BSON para o método MongoDB\Collection::aggregate()
, conforme mostrado no código a seguir:
$pipeline = [ ['<stage>' => <parameters>], ['<stage>' => <parameters>], ... ]; $cursor = $collection->aggregate($pipeline);
Os exemplos nesta seção utilizam a coleção do restaurants
no banco de dados de dados do sample_restaurants
a partir do conjunto 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 .
Exemplo de filtro e grupo
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 que contém os seguintes estágios:
estágio $match para filtrar documentos nos quais o campo
cuisine
contém o valor'Bakery'
$group estágio para agrupar os documentos correspondentes pelo campo
borough
, acumulando uma contagem de documentos para cada valor distinto
$pipeline = [ ['$match' => ['cuisine' => 'Bakery']], ['$group' => ['_id' => '$borough', 'count' => ['$sum' => 1]]], ]; $cursor = $collection->aggregate($pipeline); foreach ($cursor as $doc) { echo json_encode($doc), PHP_EOL; }
{"_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}
Explicar uma agregação
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 pelo MongoDB e quaisquer planos de execução rejeitados.
Para explicar uma operação de agregação , construa um objeto MongoDB\Operation\Aggregate
e passe os estágios de banco de dados de dados, coleção e pipeline como parâmetros. Em seguida, passe o objeto MongoDB\Operation\Aggregate
para o método MongoDB\Collection::explain()
.
O exemplo a seguir instrui o MongoDB a explicar a operação de agregação da seção anterior:
$pipeline = [ ['$match' => ['cuisine' => 'Bakery']], ['$group' => ['_id' => '$borough', 'count' => ['$sum' => 1]]], ]; $aggregate = new MongoDB\Operation\Aggregate( $collection->getDatabaseName(), $collection->getCollectionName(), $pipeline ); $result = $collection->explain($aggregate); echo json_encode($result), PHP_EOL;
{"explainVersion":"2","queryPlanner":{"namespace":"sample_restaurants.restaurants", "indexFilterSet":false,"parsedQuery":{"cuisine":{"$eq":"Bakery"}},"queryHash":"865F14C3", "planCacheKey":"D56D6F10","optimizedPipeline":true,"maxIndexedOrSolutionsReached":false, "maxIndexedAndSolutionsReached":false,"maxScansToExplodeReached":false,"winningPlan":{ ... }
Construtor de agregações
Para criar um pipeline de agregação usando o Construtor de Agregações, execute as seguintes ações:
Crie uma array para armazenar os estágios do pipeline.
Para cada estágio, chame um método de fábrica do
Stage
que tenha o mesmo nome do estágio de agregação desejado. Por exemplo, para criar um estágio$unwind
, chame o métodoStage::unwind()
.No corpo do método
Stage
, use métodos de outras classes de construtores, comoQuery
,Expression
ouAccumulator
, para expressar suas especificações de agregação .
O seguinte código demonstra o modelo para construir pipelines de agregação :
$pipeline = [ Stage::<factory method>( <stage specification> ), Stage::<factory method>( <stage specification> ), ... ]; $cursor = $collection->aggregate($pipeline);
Os exemplos nesta seção são adaptados do manual do MongoDB Server . Cada exemplo fornece um link para os dados de amostra que você pode inserir em seu banco de dados para testar a operação de agregação .
Dica
Operações com construtores
Você pode usar construtores para suportar operações não agregadas, como operações de localização e atualização. Para saber mais, consulte o guia Operações com a Builders.
Exemplo de filtro e grupo
Este exemplo usa os dados de amostra fornecidos na seção Calcular Contagem, Soma e Média da $group
referência de estágio no manual do Servidor.
O exemplo de código a seguir calcula o valor total de vendas, a quantidade média de vendas e a contagem de vendas para cada dia no ano 2014. Para fazer isso, ele usa um pipeline de agregação que contém os seguintes estágios:
estágio$match para filtrar documentos que contêm um
date
campo em que o ano é 2014estágio$sort para classificar os resultados pelo valor total da venda para cada grupo em ordem decrescente
$pipeline = [ MongoDB\Builder\Stage::match( date: [ MongoDB\Builder\Query::gte(new MongoDB\BSON\UTCDateTime(new DateTimeImmutable('2014-01-01'))), MongoDB\Builder\Query::lt(new MongoDB\BSON\UTCDateTime(new DateTimeImmutable('2015-01-01'))), ], ), MongoDB\Builder\Stage::group( _id: MongoDB\Builder\Expression::dateToString(MongoDB\Builder\Expression::dateFieldPath('date'), '%Y-%m-%d'), totalSaleAmount: MongoDB\Builder\Accumulator::sum( MongoDB\Builder\Expression::multiply( MongoDB\Builder\Expression::numberFieldPath('price'), MongoDB\Builder\Expression::numberFieldPath('quantity'), ), ), averageQuantity: MongoDB\Builder\Accumulator::avg( MongoDB\Builder\Expression::numberFieldPath('quantity'), ), count: MongoDB\Builder\Accumulator::sum(1), ), MongoDB\Builder\Stage::sort( totalSaleAmount: MongoDB\Builder\Type\Sort::Desc, ), ]; $cursor = $collection->aggregate($pipeline); foreach ($cursor as $doc) { echo json_encode($doc), PHP_EOL; }
{"_id":"2014-04-04","totalSaleAmount":{"$numberDecimal":"200"},"averageQuantity":15,"count":2} {"_id":"2014-03-15","totalSaleAmount":{"$numberDecimal":"50"},"averageQuantity":10,"count":1} {"_id":"2014-03-01","totalSaleAmount":{"$numberDecimal":"40"},"averageQuantity":1.5,"count":2}
Exemplo de arrays incorporadas de unwind
Este exemplo usa os dados de amostra fornecidos na seção Unwind Embedded Arrays da $unwind
referência de estágio no manual do servidor.
O exemplo de código a seguir agrupa itens vendidos por suas marcações e calcula o valor total de vendas para cada marcação. Para fazer isso, ele usa um pipeline de agregação que contém os seguintes estágios:
Estágio$unwind para gerar um documento separado para cada elemento da
items
arrayEstágio$unwind para gerar um documento separado para cada elemento das
items.tags
arrays$group estágio para agrupar os documentos pelo valor da tag e calcular o valor total de vendas de itens que têm cada tag
$pipeline = [ MongoDB\Builder\Stage::unwind(MongoDB\Builder\Expression::arrayFieldPath('items')), MongoDB\Builder\Stage::unwind(MongoDB\Builder\Expression::arrayFieldPath('items.tags')), MongoDB\Builder\Stage::group( _id: MongoDB\Builder\Expression::fieldPath('items.tags'), totalSalesAmount: MongoDB\Builder\Accumulator::sum( MongoDB\Builder\Expression::multiply( MongoDB\Builder\Expression::numberFieldPath('items.price'), MongoDB\Builder\Expression::numberFieldPath('items.quantity'), ), ), ), ]; $cursor = $collection->aggregate($pipeline); foreach ($cursor as $doc) { echo json_encode($doc), PHP_EOL; }
{"_id":"office","totalSalesAmount":{"$numberDecimal":"1019.60"}} {"_id":"school","totalSalesAmount":{"$numberDecimal":"104.85"}} {"_id":"stationary","totalSalesAmount":{"$numberDecimal":"264.45"}} {"_id":"electronics","totalSalesAmount":{"$numberDecimal":"800.00"}} {"_id":"writing","totalSalesAmount":{"$numberDecimal":"60.00"}}
Exemplo de união de igualdade única
Este exemplo utiliza os dados de amostra fornecidos na seção Executar uma única união de igualdade com $lookup da $lookup
referência de estágio no manual do Servidor.
O exemplo de código a seguir une os documentos da collection orders
aos documentos da collection inventory
usando o campo item
da collection orders
e o campo sku
da collection inventory
.
Para fazer isso, o exemplo usa um pipeline de agregação que contém um estágio $lookup que especifica a coleção para recuperar os dados e os nomes dos campo locais e externos.
$pipeline = [ MongoDB\Builder\Stage::lookup( from: 'inventory', localField: 'item', foreignField: 'sku', as: 'inventory_docs', ), ]; /* Performs the aggregation on the orders collection */ $cursor = $collection->aggregate($pipeline); foreach ($cursor as $doc) { echo json_encode($doc), PHP_EOL; }
{"_id":1,"item":"almonds","price":12,"quantity":2,"inventory_docs":[{"_id":1,"sku":"almonds","description":"product 1","instock":120}]} {"_id":2,"item":"pecans","price":20,"quantity":1,"inventory_docs":[{"_id":4,"sku":"pecans","description":"product 4","instock":70}]} {"_id":3,"inventory_docs":[{"_id":5,"sku":null,"description":"Incomplete"},{"_id":6}]}
Informações adicionais
Para exibir um tutorial que usa a biblioteca PHP do MongoDB para criar pipelines de agregação complexos, consulte Pipelines de agregação complexos com Baunilha PHP e MongoDB no MongoDB Developer Center.
Para exibir mais exemplos de pipelines de agregação criados usando o Construtor de agregações, consulte o Conjunto de testes de classe de estágio no código-fonte da biblioteca PHP no GitHub.
Manual do MongoDB Server
Para saber mais sobre os tópicos discutidos neste guia, consulte as seguintes páginas no manual do MongoDB Server :
Para ver uma lista completa de operadores de expressão, consulte Operadores de aggregation.
Para saber mais sobre como montar uma agregação pipeline e ver exemplos, consulte Aggregation Pipeline.
Para saber mais sobre como criar estágios de pipeline, consulte Estágios de agregação.
Para saber mais sobre como explicar as operações do MongoDB, consulte Explicar planos de saída e query.
Atlas Search e Vector Search
Você pode realizar pesquisas de texto completo usando a funcionalidade Atlas Search . Para saber mais, consulte o guia do Atlas Search .
Você pode realizar pesquisas de similaridade em incorporações vetoriais usando o recurso Atlas Vector Search . Para saber mais, consulte o guia Atlas Vector Search .
Documentação da API
Para saber mais sobre os métodos discutidos neste guia, consulte a seguinte documentação da API: