MongoDB Ag­gre­ga­tion é uma fer­ra­menta valiosa a todos que desejam analisar ou filtrar bancos de dados. Seu pipeline de agregação permite a re­a­li­za­ção de consultas complexas e, con­se­quen­te­mente, a obtenção de re­sul­ta­dos finais es­pe­cí­fi­cos.

O que é MongoDB Ag­gre­ga­tion?

MongoDB é um banco de dados não re­la­ci­o­nal e orientado a do­cu­men­tos, projetado para lidar com grandes volumes e di­fe­ren­tes tipos de dados. Ao dispensar tabelas rígidas e utilizar técnicas de sharding, que armazenam dados em di­fe­ren­tes nós, essa solução NoSQL pode ser escalada ho­ri­zon­tal­mente, sem que perca sua fle­xi­bi­li­dade e aumente o risco de falhas. Seus do­cu­men­tos, que possuem o formato BSON (JSON binário), são agrupados em coleções e podem ser con­sul­ta­dos e ma­ni­pu­la­dos com pela MongoDB Query Language, linguagem de pro­gra­ma­ção própria. Embora essa linguagem seja adequada a di­fe­ren­tes usos, ela não é su­fi­ci­ente para realizar análises de dados. Jus­ta­mente por isso, o MongoDB Ag­gre­ga­tion existe.

No contexto de tec­no­lo­gia da in­for­ma­ção (TI), ag­gre­ta­tion (agregação, em português) diz respeito à obtenção de in­for­ma­ções con­so­li­da­das. Portanto, o MongoDB Ag­gre­ga­tion analisa e filtra um ou vários do­cu­men­tos ar­ma­ze­na­dos pelo banco de dados, com base em fatores pre­de­fi­ni­dos, apre­sen­tando, ao final do processo, um resultado claro e es­pe­cí­fico. Neste tutorial, ex­plo­ra­re­mos não somente as diversas pos­si­bi­li­da­des de análise que o MongoDB Ag­gre­ga­tion oferece, mas também mos­tra­re­mos como você pode usar o método aggregate() no sistema de ge­ren­ci­a­mento de banco de dados (DMBS) com di­fe­ren­tes exemplos.

O que fazer para começar a usar o MongoDB Ag­gre­ga­tion?

Para fazer uso do MongoDB Ag­gre­ga­tion, você precisa se atentar a algumas condições: o método deve ser executado no shell e operar de acordo com regras lógicas, que podem ser ser adaptadas para cor­res­pon­der às suas ne­ces­si­da­des in­di­vi­du­ais. Antes de começar, instale o MongoDB no seu com­pu­ta­dor — aprenda a baixar, instalar e executar este banco de dados com o nosso tutorial in­tro­du­tó­rio sobre MongoDB. Além disso, re­co­men­da­mos que você configure um firewall robusto e que ajuste o seu banco de dados de acordo com os padrões de segurança adotados. Para realizar processos de agregação no MongoDB, você também precisará de pri­vi­lé­gios de ad­mi­nis­tra­dor.

Dica

O banco de dados MongoDB é com­pa­tí­vel com as mais diversas pla­ta­for­mas, por isso os passos descritos a seguir podem ser re­a­li­za­dos em qualquer sistema ope­ra­ci­o­nal.

O que é pipeline de agregação no MongoDB?

No MongoDB, existe a pos­si­bi­li­dade de se realizar pesquisas e consultas simples. Nesses casos, o banco de dados é capaz de fornecer os re­sul­ta­dos esperados de imediato. No entanto, esse método “tra­di­ci­o­nal” é bastante limitado, pois só consegue exibir re­sul­ta­dos que já existem nos do­cu­men­tos ar­ma­ze­na­dos. Para uma análise mais profunda, contendo padrões re­cor­ren­tes ou in­for­ma­ções adi­ci­o­nais, esse tipo de consulta não funciona. Então, o que fazer quando se precisa con­si­de­rar di­fe­ren­tes fontes dentro de um banco de dados para a obtenção de re­sul­ta­dos in­di­vi­du­ais? Usar a fer­ra­menta MongoDB Ag­gre­ga­tion, que retorna re­sul­ta­dos es­pe­cí­fi­cos após realizar uma sequência de estágios, chamada de pipeline de agregação.

Quais são as funções do pipeline de agregação?

Pipeline de agregação no MongoDB é o processo que analisa e filtra os dados exis­ten­tes no banco de dados, ao realizar uma sequência de estágios (stages) in­ter­me­diá­rios. Somente assim o resultado desejado pode ser retornado. Ainda, a depender dos re­qui­si­tos, um ou mais estágios podem ser iniciados. Eles são exe­cu­ta­dos se­quen­ci­al­mente, a fim de trans­for­mar a entrada original no resultado final desejado, que será apre­sen­tado após a execução do último estágio. Enquanto os do­cu­men­tos de entrada são compostos por di­fe­ren­tes dados, o resultado final é es­pe­cí­fico.

Acompanhe di­fe­ren­tes estágios que podem ser aplicados no MongoDB Ag­gre­ga­tion.

Qual é a sintaxe do pipeline de agregação?

Antes de apre­sen­tar­mos os nossos exemplos de aplicação de estágios, des­ta­ca­mos a estrutura básica do MongoDB Ag­gre­ga­tion. O método segue sempre o mesmo esquema, que pode ser adaptado para atender a ne­ces­si­da­des es­pe­cí­fi­cas. Esta é a sintaxe do MongoDB Ag­gre­ga­tion:

db.collection_name.aggregate ( pipeline, options )
shell

Aqui, collection_name faz re­fe­rên­cia ao nome da coleção a ser analisada. Sob pipeline devem ser listados os estágios ne­ces­sá­rios para a obtenção do resultado desejado. Por sua vez, options dizem respeito a pa­râ­me­tros adi­ci­o­nais, que podem ser usados para es­pe­ci­fi­car a saída.

Quais são os estágios do pipeline de agregação?

Um pipeline de agregação, no MongoDB Ag­gre­ga­tion, executa di­fe­ren­tes estágios, mas não somente isso: a maioria deles pode ser executada várias vezes dentro do mesmo pipeline.

Apesar de a lista abaixo não conter todos os estágios de agregação possíveis — que são inúmeros — reunimos, para você, os mais comumente uti­li­za­dos:

  • $count: Com esse estágio, você obtém um valor que indica quantos do­cu­men­tos BSON foram con­si­de­ra­dos para o(s) estágio(s) do res­pec­tivo pipeline.
  • $group: Esse estágio clas­si­fica e agrupa do­cu­men­tos com base em de­ter­mi­na­dos pa­râ­me­tros.
  • $limit: Com esse estágio, você limita os do­cu­men­tos exibidos.
  • $match: Com esse estágio, você limita os do­cu­men­tos que a serem con­si­de­ra­dos pelo próximo estágio.
  • $out: Com esse estágio, os re­sul­ta­dos obtidos pelo processo de agregação são inseridos na coleção — este estágio deve ser sempre o estágio final de um pipeline.
  • $project: Com esse estágio, você consegue se­le­ci­o­nar campos es­pe­cí­fi­cos de uma coleção.
  • $skip: Esse estágio ignora um número es­pe­cí­fico de do­cu­men­tos, que pode ser definido nas opções.
  • $sort: Com esse estágio, você ordena os do­cu­men­tos de acordo com o método que escolheu. No entanto, ele não realiza nenhuma outra mo­di­fi­ca­ção.
  • $unset: Esse estágio exclui campos es­pe­cí­fi­cos, agindo como o oposto de $project.

Exemplos de uso do MongoDB Ag­gre­ga­tion

Para que você entenda melhor como funciona o MongoDB Ag­gre­ga­tion na prática, ela­bo­ra­mos alguns exemplos que processam di­fe­ren­tes estágios e também explicam o fun­ci­o­na­mento destes. Para começar a usar o MongoDB Ag­gre­ga­tion, inicie o shell com direitos de ad­mi­nis­tra­dor. Pro­va­vel­mente, um banco de dados para testes será exibido ini­ci­al­mente. Para acessar outro banco de dados, execute o comando use.

O nosso exemplo diz respeito a um banco de dados com in­for­ma­ções sobre clientes que compraram um produto es­pe­cí­fico. Este banco de dados contém dez do­cu­men­tos, que seguem todos o mesmo esquema:

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

As in­for­ma­ções sobre cada comprador são as seguintes: nome, cidade, país e quan­ti­dade de produtos ad­qui­ri­dos.

Para apli­car­mos a fer­ra­menta MongoDB Ag­gre­ga­tion neste banco de dados, fizemos uso do método insertMany(). Ele adi­ci­o­nará todos os do­cu­men­tos com dados de clientes à coleção “clients” (clientes):

db.clients.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

Ao exe­cu­tar­mos essa entrada, obtemos como resultado uma lista com os IDs dos objetos de cada documento in­di­vi­dual.

Como usar $match para filtrar do­cu­men­tos

Para explorar di­fe­ren­tes pos­si­bi­li­da­des do MongoDB Ag­gre­ga­tion, aplicamos $match à nossa coleção “clients”, no primeiro estágio de agregação. Se op­tás­se­mos por não inserir nenhum parâmetro adicional, ob­te­ría­mos a lista completa de dados dos clientes men­ci­o­na­dos. Neste exemplo de código, contudo, ins­truí­mos o método a con­si­de­rar somente os clientes da Itália:

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

Nesse caso, o resultado final exibirá somente os IDs dos objetos e os dados dos dois clientes italianos.

Como usar $sort para ordenar do­cu­men­tos

Você também pode usar o MongoDB Ag­gre­ga­tion para ordenar o seu banco de dados, exe­cu­tando o estágio $sort. No exemplo a seguir, ins­truí­mos o nosso banco de dados a ordenar todos os dados de clientes baseando-se na quan­ti­dade de unidades compradas, do maior para o menor número. Assim ficou a nossa entrada:

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

Como usar $project para se­le­ci­o­nar campos

Nos estágios até então aplicados, obtivemos re­sul­ta­dos re­la­ti­va­mente extenso. Além das in­for­ma­ções contidas pelos do­cu­men­tos, os IDs dos objetos também foram exibidos pelo resultado final, por exemplo. Contudo, com o estágio $project, é possível de­ter­mi­nar as in­for­ma­ções que devem ser exibidas pelo pipeline de agregação. Assim, atri­buí­mos valor 1 para os campos ne­ces­sá­rios e valor 0 para os campos des­ne­ces­sá­rios. No exemplo abaixo, desejamos que somente o nome do cliente e a quan­ti­dade de produtos comprados sejam exibidos. Para isso, exe­cu­ta­mos o seguinte comando:

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

Como combinar estágios no MongoDB Ag­gre­ga­tion

O MongoDB Ag­gre­ga­tion também permite que vários estágios sejam exe­cu­ta­dos em sequência. Ao ocorrerem se­quen­ci­al­mente, eles apre­sen­tam um resultado final que abrange todos os pa­râ­me­tros es­ta­be­le­ci­dos. Para obtermos apenas os nomes e as compras dos clientes alemães e em ordem de­cres­cente, aplicamos os três estágios descritos an­te­ri­or­mente da seguinte maneira:

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

Quer aprender ainda mais sobre MongoDB? O nosso Digital Guide ajuda você nessa em­prei­tada. Aprenda como listar bancos de dados no MongoDB e como ordenar do­cu­men­tos no MongoDB com o operador sort.

Ir para o menu principal