Transforme seus dados com agregação
Nesta página
Visão geral
Neste guia, você pode aprender como usar o driver C para executar operações de agregação.
Você pode usar operações de agregação para processar dados em suas coleções MongoDB e retornar resultados calculados. A estrutura de agregação MongoDB , que faz parte da API de query, é modelada sobre o conceito de um pipeline de processamento de dados. Os documentos entram em um pipeline que contém um ou mais estágios, e cada estágio transforma os documentos para gerar um resultado final agregado.
Você pode pensar em 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:
Execute operações de localização
Renomear campos
Calcular campos
Resumir dados
Agrupar valores
Limitações
As seguintes limitações se aplicam ao usar operações de agregação :
Os documentos devolvidos não devem violar o limite de tamanho de 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 este limite configurando a opção
allowDiskUse
paratrue
.
Importante
exceção $graphLookup
O estágio $graphLookup tem um limite de memória rigoroso de 100 megabytes e ignora a opção allowDiskUse
.
Exemplo de agregação
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 .
Criar e Executar um Pipeline de Agregação
Para executar uma agregação nos documentos em uma coleção, passe uma estrutura bson_t
que represente os estágios de pipeline para a função mongoc_collection_aggregate()
.
Este exemplo gera uma contagem do número de Padarias em cada bairro da cidade de Nova York. O código abaixo cria um pipeline de agregação que contém os seguintes estágios:
Um estágio $match para filtrar os documentos em que o valor do campo
cuisine
é"Bakery"
.Um estágio $group para agrupar os documentos correspondentes pelo campo
borough
, produzindo uma contagem de documentos para cada valor distinto desse campo.
const bson_t *doc; bson_t *pipeline = BCON_NEW ("pipeline", "[", "{", "$match", "{", "cuisine", BCON_UTF8 ("Bakery"), "}", "}", "{", "$group", "{", "_id", BCON_UTF8 ("$borough"), "count", "{", "$sum", BCON_INT32 (1), "}", "}", "}", "]"); mongoc_cursor_t *results = mongoc_collection_aggregate (collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL); bson_error_t error; if (mongoc_cursor_error (results, &error)) { fprintf (stderr, "Aggregate failed: %s\n", error.message); } else { while (mongoc_cursor_next (results, &doc)) { char *str = bson_as_canonical_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); } } bson_destroy (pipeline); mongoc_cursor_destroy (results);
{ "_id" : "Queens", "count" : { "$numberInt" : "204" } } { "_id" : "Staten Island", "count" : { "$numberInt" : "20" } } { "_id" : "Missing", "count" : { "$numberInt" : "2" } } { "_id" : "Bronx", "count" : { "$numberInt" : "71" } } { "_id" : "Brooklyn", "count" : { "$numberInt" : "173" } } { "_id" : "Manhattan", "count" : { "$numberInt" : "221" } }
Explicar uma agregação
Para visualizar informações sobre como o MongoDB executa sua operação, você pode executar a operação explain
em seu pipeline. 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 de o MongoDB concluir uma operação. Quando você instrui o MongoDB a explicar uma operação, ele retorna o plano que o MongoDB selecionou para a operação e quaisquer planos de execução rejeitados.
O seguinte exemplo de código executa a mesma agregação mostrada na seção anterior, mas utiliza a função mongoc_client_command_simple()
para explicar os detalhes da operação:
bson_t reply; bson_error_t error; bson_t *command = BCON_NEW ( "aggregate", BCON_UTF8 ("restaurants"), "explain", BCON_BOOL(true), "pipeline", "[", "{", "$match", "{", "cuisine", BCON_UTF8("Bakery"), "}", "}", "{", "$group", "{", "_id", BCON_UTF8("$borough"), "count", "{", "$sum", BCON_INT32(1), "}", "}", "}", "]"); if (mongoc_client_command_simple (client, "sample_restaurants", command, NULL, &reply, &error)) { char *str = bson_as_canonical_extended_json (&reply, NULL); printf ("%s\n", str); bson_free (str); } else { fprintf (stderr, "Command failed: %s\n", error.message); } bson_destroy (command); bson_destroy (&reply);
{ "explainVersion": "2", "queryPlanner": { "namespace": "sample_restaurants.restaurants" "indexFilterSet": false, "parsedQuery": { "cuisine": {"$eq": "Bakery"} }, "queryHash": "865F14C3", "planCacheKey": "0697561B", "optimizedPipeline": true, "maxIndexedOrSolutionsReached": false, "maxIndexedAndSolutionsReached": false, "maxScansToExplodeReached": false, "winningPlan": { ... }, "rejectedPlans": [] ... } ... }
Informações adicionais
Para ver uma lista completa de operadores de expressão , consulte Operadores de aggregation no manual do MongoDB Server .
Para saber mais sobre como montar um pipeline de agregação e ver exemplos, consulte Pipeline de agregação no manual do MongoDB Server .
Para saber mais sobre como criar estágios de pipeline, consulte Estágios de agregação no manual do MongoDB Server .
Para saber mais sobre como explicar as operações do MongoDB , consulte Explicar planos de saída e query no manual do MongoDB Server .
Documentação da API
Para obter mais informações sobre como executar operações de agregação com o driver C, consulte a seguinte documentação da API: