Introdução ao framework de agregação do MongoDB
Avalie esse Início rápido
Uma das dificuldades ao armazenar qualquer dado é saber como ele será acessado no futuro. Quais relatórios precisam ser executados nele? Quais informações estão "escondidas" lá dentro que permitirão insights significativos para o seu negócio? Depois de gastar o tempo para projetar seu esquema de dados da maneira apropriada para o aplicativo, é preciso ser capaz de recuperá-lo. No MongoDB, há duas maneiras básicas de recuperação de dados: por meio de queries com o comando find() e por meio de análises usando o framework a de agregação e o comando aggregate().
find()
permite a consulta de dados com base em uma condição. É possível filtrar os resultados, fazer transformações básicas de documentos, classificar os documentos, limitar o conjunto de resultados do documento, etc. O comando aggregate()
abre as portas para um mundo totalmente novo com o framework de agregação. Nesta série de postagens, analisarei alguns dos motivos pelos quais o uso do framework de agregação é tão poderoso e como aproveitar esse poder.Uma pergunta frequente é: por que fazer agregação dentro do MongoDB? Da documentação do MongoDB:
Operações de agregação processam registros de dados e retornam resultados calculados. As operações de agregação agrupam valores de vários documentos e podem executar uma variedade de operações nos dados agrupados para retornar um único resultado.
Usando os operadores de agregação internos disponíveis no MongoDB, podemos fazer análises em um cluster de servidores que já estamos usando sem precisar mover os dados para outra plataforma, como Apache Spark ou Hadoop. Embora essas e outras plataformas semelhantes sejam rápidas, a transferência de dados do MongoDB para elas pode ser lenta e potencialmente cara. Usando o framework de agregação, o trabalho é feito dentro do MongoDB e, em seguida, os resultados finais podem ser enviados para o aplicativo, normalmente resultando em uma quantidade menor de dados sendo movidos. Ele também permite a consulta da versão LIVE dos dados e não uma cópia mais antiga dos dados de um lote.
A agregação no MongoDB permite a transformação de dados e resultados de uma forma mais poderosa do que usar o comando
find()
. Por meio do uso de vários estágios e expressões, você pode criar um "pipeline" de operações em seus dados para executar operações analíticas. O que quero dizer com "pipeline"? O framework de agregação é conceitualmente semelhante ao pipe de linha de comando *nix
, |
. No pipeline da linha de comando *nix
, um pipe transfere a saída padrão para algum outro destino. A saída de um comando é enviada para outro comando para processamento posterior.No framework de agregação, pensamos em estágios em vez de comandos. E o estágio "saída" são documentos. Os documentos entram em um estágio, algum trabalho é feito e os documentos são lançados. De lá, eles podem passar para outro estágio ou fornecer resultados.
No momento em que este artigo foi escrito, há vinte e oito diferentes estágios de agregação disponíveis. Esses diferentes estágios fornecem a capacidade de fazer uma ampla variedade de tarefas. Por exemplo, podemos criar um pipeline de agregação que corresponda a um conjunto de documentos com base em um conjunto de critérios, agrupe esses documentos, classifique-os e retorne esse conjunto de resultados para nós.
Ou talvez nosso pipeline seja mais complicado e o documento passe pelo estágio
$match
, $unwind
, $group
, $sort
, $limit
, $project
e, finalmente, um estágio $skip
.Isso pode ser confuso e vale a pena repetir alguns desses conceitos. Portanto, vamos analisar isso mais a fundo:
- Um pipeline começa com documentos
- Esses documentos vêm de uma coleção, de uma visualização ou de um estágio especialmente projetado
- Em cada estágio, os documentos entram, o trabalho é feito e os documentos saem
- Os próprios estágios são definidos usando a sintaxe do documento
Vejamos um exemplo de pipeline. Nossos documentos são dos Dados de amostra que estão disponíveis no MongoDB Atlas e da coleção do
routes
no banco de dados do sample_training
. Aqui está um documento de amostra:1 { 2 "_id":{ 3 "$oid":"56e9b39b732b6122f877fa31" 4 }, 5 "airline":{ 6 "id":{ 7 "$numberInt":"410" 8 }, 9 "name":"Aerocondor" 10 ,"alias":"2B" 11 ,"iata":"ARD" 12 }, 13 "src_airport":"CEK", 14 "dst_airport":"KZN", 15 "Codeshare":"", 16 "stops":{ 17 "$numberInt":"0" 18 }, 19 "airplane":"CR2" 20 }
Se você ainda não configurou seu cluster gratuito no MongoDB Atlas, agora é um ótimo momento para fazer isso. Você tem todas as instruções nesta publicação no blog.
Para esta query de exemplo, encontraremos as três principais companhias aéreas que oferecem a maior parte dos voos diretos para fora do aeroporto de Oregon, EUA (PDX). Para começar, criaremos um estágio
$match
para que possamos nos concentrar em fazer o trabalho apenas nos documentos que atendem a uma base de condições. Nesse caso, procuraremos documentos com um src_airport
, ou aeroporto de origem, de PDX e que sejam voos diretos, ou seja, que não tenham escalas.1 { 2 $match: { 3 "src_airport": "PDX", 4 "stops": 0 5 } 6 }
Isso reduz o número de documentos em nosso pipeline de 66.985 para 113. Em seguida, agruparemos pelo nome da companhia aérea e contaremos o número de voos:
1 { 2 $group: { 3 _id: { 4 "airline name": "$airline.name" 5 }, 6 count: { 7 $sum: 1 8 } 9 } 10 }
Com a adição do estágio
$group
, reduzimos para 16 documentos. Vamos classificar aqueles com um estágio $sort
e classificar em ordem decrescente:1 { 2 $sort: { 3 count: -1 4 }
Em seguida, podemos adicionar um estágio
$limit
para ter apenas as três principais companhias aéreas que atendem Portland, Oregon:1 { 2 $limit: 3 3 }
Depois de colocar os documentos na coleção
sample_training.routes
por esse pipeline de agregação, nossos resultados nos mostram que as três principais companhias aéreas que oferecem voos sem escalas partindo de PDX são Alaska, American e United Airlines, com 39, 17 e 13 voos, respectivamente.Como isso fica no código? É bastante simples usar a função
db.aggregate()
. Por exemplo, no Python você faria algo como:1 from pymongo import MongoClient 2 3 # Requires the PyMongo package. 4 # The dnspython package is also required to use a mongodb+src URI string 5 # https://api.mongodb.com/python/current 6 7 client = MongoClient('YOUR-ATLAS-CONNECTION-STRING') 8 result = client['sample_training']['routes'].aggregate([ 9 { 10 '$match': { 11 'src_airport': 'PDX', 12 'stops': 0 13 } 14 }, { 15 '$group': { 16 '_id': { 17 'airline name': '$airline.name' 18 }, 19 'count': { 20 '$sum': 1 21 } 22 } 23 }, { 24 '$sort': { 25 'count': -1 26 } 27 }, { 28 '$limit': 3 29 } 30 ])
O código de agregação também é bem semelhante em outras linguagens.
O framework de agregação do MongoDB é um conjunto extremamente poderoso de ferramentas. O processamento é feito no próprio servidor, o que resulta em menos dados enviados pela rede. No exemplo usado aqui, em vez de extrair todos os documentos para um aplicativo e processá-los lá, o framework de agregação permite que apenas os três documentos que queremos de nossa query sejam enviados de volta para o aplicativo.
Esta foi apenas uma breve introdução a alguns dos operadores disponíveis. Ao longo desta série, examinarei mais de perto alguns dos operadores de framework de agregação mais populares, bem como alguns interessantes, mas menos usados. Também examinarei as considerações de desempenho do uso do framework de agregação.