Trabalhar com MongoDB oferece algumas praticidades e alguns desafios bem interessantes. Às vezes nós precisamos realizar consultar mais complexas no banco de dados que o simples “findOne” não atende. É aí que entram as operações de aggregattion do MongoDB, que processam múltiplos documentos e retorna os resultados computados de acordo com o que determinarmos em um pipeline.
Pipelines
Em um pipeline de aggregations, podemos incluir um ou mais estágios em que os documentos serão processados. Cada estágio realizará uma operação com os documentos que entram (input) e devolve um resultado (output). Os documentos que saem em um estágio passam para serem processados no próximo estágio.
Exemplo de pipeline
Vou mostrar um exemplo bem simples de como funciona uma sequência de estágios em um aggregation. Em breve postarei outros exemplos com operadores mais complexos.
Dado uma simples coleção de alunos com os seguintes documentos:
[{
"_id": {
"$oid": "63c5b2a9c8f4d4972b847a45"
},
"nome": "João da Silva",
"idade": 12
},{
"_id": {
"$oid": "63c5b2dac8f4d4972b847a46"
},
"nome": "Maria Souza",
"idade": 13
},{
"_id": {
"$oid": "63c5b330c8f4d4972b847a47"
},
"nome": "Enzo Lorenzo",
"idade": 11
}]
Podemos construir um pipeline que irá encontrar alunos com idade maior ou igual a 12 e contar os resultados
Primeiro estágio, match:
{
$match: {
'idade': { $gte: 12 }
}
}
Esse primeiro estágio deve obter somente 2 alunos do exemplo:
[{
"_id": {
"$oid": "63c5b2a9c8f4d4972b847a45"
},
"nome": "João da Silva",
"idade": 12
},{
"_id": {
"$oid": "63c5b2dac8f4d4972b847a46"
},
"nome": "Maria Souza",
"idade": 13
}]
Segundo estágio, count
{
$count: 'contagem'
}
Esse segundo estágio irá resultar em um único documento com a propriedade ‘contagem’
[{
"contagem": 2
}]
Uma ferramenta poderosa
Esse foi um exemplo simples. Mas logo você descobre que a aggregation é uma ferramento poderosíssima, mas que deve ser utilizada com muita sabedoria, pois ela é muito flexível para transformar e consultar os documentos de uma coleção, porém um pipeline com estágios em demasia pode resultar com consultas muito demoradas que podem criar um funil na sua API.
Portanto, sempre faça uma avaliação do que deseja montar em sua consulta e veja se vale a pena construir uma coleção nova em que você irá armazenar documentos transformados a partir da primeira coleção. Sempre tenha em mente alguns redflags quando estiver planejando um pipeline de consulta para aggregation, como muitos $lookUps (populate a partir de outras coleções), muitas transformações no documento original ou muitos operadores computacionais.
Muito bom Danilo,
Acho que numa próxima, poderia mostrar como montar um runbook no Compass. Tenho certeza que a Janaina ia adorar 😀