A agregação MongoDB é uma fer­ra­menta valiosa se você deseja analisar ou filtrar suas bases de dados. Este sistema de ca­na­li­za­ção permite es­pe­ci­fi­car consultas e, portanto, também saídas per­so­na­li­za­das.

O que é a agregação MongoDB?

O MongoDB é uma base de dados orientada para do­cu­men­tos não re­la­ci­o­nais, concebida para utilizar grandes quan­ti­da­des de dados. Ao pres­cin­dir de tabelas rígidas e utilizar técnicas como a frag­men­ta­ção, em que os dados são ar­ma­ze­na­dos em di­fe­ren­tes nós, esta solução NoSQL pode ser escalada ho­ri­zon­tal­mente sem perder fle­xi­bi­li­dade nem proteção contra falhas. Os do­cu­men­tos em formato BSON (binary JSON) são agrupados nas chamadas coleções e podem ser con­sul­ta­dos e editados através da linguagem de consulta do MongoDB. Embora essa linguagem ofereça muitas opções, ela não é adequada (ou é in­su­fi­ci­ente) para analisar dados. Por isso existe a agregação MongoDB.

Este termo é utilizado para descrever vários processos em in­for­má­tica. Em relação ao MongoDB, agregação significa de­ter­mi­na­ção de in­for­ma­ções resumidas. Para isso, os dados de um ou vários do­cu­men­tos são ana­li­sa­dos e filtrados com base em de­ter­mi­na­dos fatores definidos. No final deste processo, obtém-se um resultado único e claro. A seguir, não só ex­pli­ca­re­mos as pos­si­bi­li­da­des que a agregação no MongoDB oferece para a análise exaustiva de dados, mas também mos­tra­re­mos como pode utilizar o método aggregate ( ) para o sistema de gestão de bases de dados com um exemplo.

Agregação MongoDB: pre­pa­ra­ti­vos e re­qui­si­tos

Para utilizar a agregação do MongoDB, são ne­ces­sá­rios apenas alguns pré-re­qui­si­tos. O método é executado no shell e segue regras lógicas que podem ser ajustadas às suas ne­ces­si­da­des in­di­vi­du­ais. Para isso, o MongoDB já deve estar instalado no seu com­pu­ta­dor. Ex­pli­ca­mos como des­car­re­gar, instalar e executar o banco de dados pela primeira vez no nosso tutorial abran­gente sobre o MongoDB. Além disso, é re­co­men­dá­vel utilizar um firewall potente e con­fi­gu­rar a sua base de dados de acordo com os padrões de segurança comuns. Para realizar a agregação no MongoDB, ne­ces­si­tará de per­mis­sões de ad­mi­nis­tra­dor. A base de dados é com­pa­tí­vel com várias pla­ta­for­mas, pelo que os passos descritos abaixo se aplicam a todos os sistemas ope­ra­ti­vos da mesma forma.

O papel do pipeline na agregação do MongoDB

Você também tem a opção de realizar pesquisas ou consultas simples no MongoDB. O banco de dados retornará ime­di­a­ta­mente os re­sul­ta­dos desejados. No entanto, este método é muito limitado, pois só pode mostrar re­sul­ta­dos que já existem nos do­cu­men­tos ar­ma­ze­na­dos. Esta forma de consulta não foi concebida para uma análise mais apro­fun­dada, padrões re­cor­ren­tes ou in­for­ma­ções adi­ci­o­nais. No entanto, às vezes é ne­ces­sá­rio con­si­de­rar di­fe­ren­tes fontes dentro de uma base de dados para poder tirar con­clu­sões sig­ni­fi­ca­ti­vas. Para tais re­qui­si­tos, utiliza-se a agregação do MongoDB. Para obter um resultado, este método utiliza pipelines.

Qual é a função do pipeline?

Os pipelines de agregação do MongoDB são processos nos quais os dados exis­ten­tes são ana­li­sa­dos e filtrados por meio de várias etapas in­ter­me­diá­rias para mostrar aos uti­li­za­do­res o resultado desejado. Essas etapas in­ter­me­diá­rias são co­nhe­ci­das como fases. De­pen­dendo dos re­qui­si­tos, pode ser iniciada uma etapa ou várias etapas. Estas são exe­cu­ta­das uma após a outra e modificam a entrada original para que, no final, seja apre­sen­tado o resultado pre­ten­dido. Enquanto a entrada é composta por numerosos dados, a saída, ou seja, o resultado final, é única. A seguir, ex­pli­ca­mos as di­fe­ren­tes etapas ofe­re­ci­das pela agregação do MongoDB.

Qual é a sintaxe dos pipelines de agregação no MongoDB?

Primeiro, é re­co­men­dá­vel dar uma breve olhada na sintaxe básica da agregação do MongoDB. O método segue sempre o mesmo esquema, embora possa ser adaptado às suas ne­ces­si­da­des es­pe­cí­fi­cas. A estrutura básica é a seguinte:

db.collection_name.aggregate ( pipeline, options )
shell

Neste caso, collecion_name é o nome da coleção con­si­de­rada. Em pipeline, são enu­me­ra­das as etapas ne­ces­sá­rias ou desejadas da agregação do MongoDB, e options pode ser utilizado para es­pe­ci­fi­car outros pa­râ­me­tros opcionais que afetam a saída ne­ces­sá­ria.

Quais são as etapas exis­ten­tes?

Existem várias etapas num pipeline de agregação no MongoDB. A maioria delas pode ser utilizada várias vezes dentro do mesmo pipeline. Uma lista completa é muito extensa, prin­ci­pal­mente porque algumas são ne­ces­sá­rias apenas para operações muito es­pe­cí­fi­cas. No entanto, pode ter uma ideia com as etapas mais uti­li­za­das que apre­sen­ta­mos aqui:

  • $count: fornece uma contagem de quantos do­cu­men­tos BSON foram con­si­de­ra­dos para a etapa ou etapas neste pipeline.
  • $group: ordena e agrupa os do­cu­men­tos de acordo com de­ter­mi­na­dos pa­râ­me­tros.
  • $limit: reduz os do­cu­men­tos apre­sen­ta­dos.
  • $match: limita os do­cu­men­tos que serão usados para a próxima etapa.
  • $out: os re­sul­ta­dos da agregação do MongoDB são incluídos na coleção. Esta etapa só pode ser utilizada no final de um pipeline.
  • $project: seleciona campos es­pe­cí­fi­cos de uma coleção.
  • $skip: ignora uma quan­ti­dade es­pe­cí­fica de do­cu­men­tos. Isso é definido por meio de uma opção.
  • $sort: ordena do­cu­men­tos de acordo com um método à sua escolha. No entanto, os do­cu­men­tos não são mo­di­fi­ca­dos além disso.
  • $unset: exclui de­ter­mi­na­dos campos e, portanto, funciona como o oposto de $project.

Agregação MongoDB: exemplos práticos

Para entender melhor como a agregação do MongoDB funciona na prática, mostramos alguns exemplos de di­fe­ren­tes etapas e como utilizá-las. Se quiser utilizar a agregação do MongoDB, abra o shell como ad­mi­nis­tra­dor. Nor­mal­mente, primeiro será exibida uma base de dados de teste. Se desejar utilizar outra base de dados, pode usar o comando use.

Para o nosso exemplo, imagine uma base de dados que contém os dados de clientes que compraram um produto es­pe­cí­fico. Por sim­pli­ci­dade, esta base de dados conterá apenas dez do­cu­men­tos, todos es­tru­tu­ra­dos de acordo com o mesmo esquema. Vamos exem­pli­fi­car este esquema da seguinte forma:

{ 
"name" : "Schmidt", 
"city" : "Berlin", 
"country" : "Germany", 
"quantity" : 14 
}
shell

As in­for­ma­ções co­nhe­ci­das por todos os com­pra­do­res são, portanto, o nome, o local de re­si­dên­cia, o país e o número de produtos ad­qui­ri­dos.

Se quiser ex­pe­ri­men­tar a agregação no MongoDB, use o método insertMany ( ) para adicionar todos os do­cu­men­tos com dados de clientes à coleção “clientes”.

db.clientes.insertMany ( [ 
{ "name" : "Schmidt", "city" : "Berlin", "country" : "Germany", "quantity" : 14 }, 
{ "name" : "Meyer", "city" : "Hamburg", "country" : "Germany", "quantity" : 26 }, 
{ "name" : "Lee", "city" : "Birmingham", "country" : "England", "quantity" : 5 }, 
{ "name" : "Rodriguez", "city" : "Madrid", "country" : "Spain", "quantity" : 19 }, 
{ "name" : "Nowak", "city" : "Krakow", "country" : "Poland", "quantity" : 13 }, 
{ "name" : "Rossi", "city" : "Milano", "country" : "Italy", "quantity" : 10 }, 
{ "name" : "Arslan", "city" : "Ankara", "country" : "Turkey", "quantity" : 18 }, 
{ "name" : "Martin", "city" : "Lyon", "country" : "France", "quantity" : 9 }, 
{ "name" : "Mancini", "city" : "Rome", "country" : "Italy", "quantity" : 21 }, 
{ "name" : "Schulz", "city" : "Munich", "country" : "Germany", "quantity" : 2 } 
] )
shell

Se criar esta entrada desta forma, será apre­sen­tada uma lista de di­fe­ren­tes IDs de objetos para cada documento in­di­vi­dual.

Como usar $match

Para ilustrar as ca­pa­ci­da­des de agregação do MongoDB, primeiro apli­ca­re­mos a etapa $match à nossa coleção “Clientes”. Sem nenhum outro parâmetro, isso sim­ples­mente nos re­tor­na­ria a lista completa dos dados dos clientes enu­me­ra­dos an­te­ri­or­mente. No entanto, no exemplo a seguir, ins­truí­mos o método a nos mostrar apenas clientes da Itália. O comando cor­res­pon­dente seria este:

db.clientes.aggregate ( [ 
{ $match : { "country" : "Italy" } } 
] )
shell

A saída agora mostrará apenas os iden­ti­fi­ca­do­res de objeto e os dados dos dois clientes italianos.

$sort para uma melhor vi­su­a­li­za­ção

Se quiser ordenar a sua base de dados de clientes, pode utilizar a agregação no MongoDB com a etapa $sort. No exemplo seguinte, indicamos ao sistema que ordene todos os dados dos clientes de acordo com o número de unidades compradas, começando pelo número mais alto. A entrada apro­pri­ada para o nosso exemplo seria a seguinte:

db.clientes.aggregate ( [ 
{ $sort : { "quantity" : -1 } } 
] )
shell

Limita o resultado com $project

Com as etapas uti­li­za­das até agora, verá que o resultado é bastante extenso. Além das in­for­ma­ções reais contidas nos do­cu­men­tos, sempre é incluído o ID do objeto, por exemplo. Com a ajuda de $project, pode de­ter­mi­nar quais in­for­ma­ções devem ser exibidas no pipeline de agregação do MongoDB. Para isso, definimos o valor 1 para os campos ne­ces­sá­rios e o valor 0 para os campos des­ne­ces­sá­rios. No nosso exemplo, queremos ver apenas o nome do cliente e a quan­ti­dade de produtos comprados. Portanto, inserimos o seguinte:

db.clientes.aggregate ( [ 
{ $project : { _id : 0, name : 1, city : 0, country : 0, quantity : 1 } } 
] )
shell

Combinar várias etapas para a agregação MongoDB

A agregação no MongoDB também oferece sempre a opção de aplicar várias etapas su­ces­si­va­mente. Estas são exe­cu­ta­das uma após a outra e, no final, obtém-se um resultado que leva em con­si­de­ra­ção todos os pa­râ­me­tros desejados. Por exemplo, se desejar apenas mostrar os nomes e as compras dos clientes alemães em ordem de­cres­cente, utilize as etapas descritas acima da seguinte forma:

db.clientes.aggregate ( [ 
{ $match : { "country" : "Germany" } } 
{ $project : { _id : 0, name : 1, city : 0, country : 0, quantity : 1 } } 
{ $sort : { "quantity" : -1 } } 
] )
shell
Ir para o menu principal