Menu Docs
Página inicial do Docs
/ / /
Manual da Biblioteca PHP

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

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.

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

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 como true e passando a array para o método MongoDB\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 .

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 .

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 .

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:

  1. estágio $match para filtrar documentos nos quais o campo cuisine contém o valor 'Bakery'

  2. $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}

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":{
... }

Para criar um pipeline de agregação usando o Construtor de Agregações, execute as seguintes ações:

  1. Crie uma array para armazenar os estágios do pipeline.

  2. 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étodo Stage::unwind().

  3. No corpo do método Stage, use métodos de outras classes de construtores, como Query, Expression ou Accumulator, 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.

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:

  1. estágio$match para filtrar documentos que contêm um date campo em que o ano é 2014

  2. estágio$group para agrupar os documentos por data e calcular o valor total das vendas, a quantidade média de vendas e a contagem de vendas para cada grupo

  3. está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}

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:

  1. Estágio$unwind para gerar um documento separado para cada elemento da items array

  2. Estágio$unwind para gerar um documento separado para cada elemento das items.tags arrays

  3. $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"}}

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}]}

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.

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

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 .

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

Voltar

Executar um comando de banco de dados