Desmistificando procedimentos armazenados no MongoDB
Avalie esse Tutorial
Se você já usou um banco de dados SQL, deve ter lido sobre procedimentos armazenados. Os procedimentos armazenados representam código SQL pré-escrito projetado para reutilização. Ao armazenar queries SQL usadas com frequência como procedimentos, você pode executá-las repetidamente. Além disso, esses procedimentos podem ser parametrizados, permitindo que eles operem em valores de parâmetro especificados. Muitas vezes, os desenvolvedores se perguntam:
- O MongoDB suporta procedimentos armazenados?
- Onde você escreve a lógica para procedimentos armazenados no MongoDB?
- Como posso executar uma query a cada meia-noite, como um trabalho CRON?
No artigo de hoje, vamos responder a essas perguntas e desmistificar os procedimentos armazenados no MongoDB.
Essenciais, um procedimento armazenado consiste em um conjunto de declarações SQL capazes de aceitar parâmetros, executar tarefas e, opcionalmente, retornar valores. No mundo do MongoDB, podemos conseguir isso usando um pipeline de agregaçãodo.
Em poucas palavras, um pipeline de agregação é basicamente uma série de estágios em que a saída de um estágio específico é uma entrada para o próximo estágio, e a saída do último estágio é o resultado final.
Agora, cada estágio executa algum tipo de processamento na entrada fornecida, como filtragem, agrupamento, modelagem, cálculo etc. Você pode até realizar pesquisa vetorial e pesquisade texto completo usando a plataforma de dados para desenvolvedores unificada do MongoDB, Atlas.
Vamos ver como o pipeline de agregação do MongoDB, os gatilhos Atlas e o change stream juntos podem atuar como uma alternativa supereficiente, poderosa e flexível aos procedimentos armazenados.
O MongoDB Atlas é uma plataforma de dados para desenvolvedores multinuvem cujo objetivo é tornar o trabalho com dados incrivelmente fácil. Ele oferece o ambiente ideal para executar o MongoDB, a solução principal de relational database.
O modelo de documento do MongoDB facilita a inovação rápida ao alinhar-se diretamente com os objetos em seu código. Essa integração perfeita torna a manipulação de dados mais intuitiva e eficiente. Com o MongoDB, você tem a flexibilidade de armazenar dados de diversas estruturas e adaptar seu esquema sem esforço à medida que seu aplicativo envolve novas funcionalidades.
O banco de dados Atlas está disponível em 100regiões + na AWS, Google Cloud e Azure. Você pode até mesmo tirar proveito de implantações multinuvem e multirregionais, permitindo que você se dirija aos fornecedores e regiões que melhor atendam aos seus usuários. Possui a melhor automação da categoria e práticas comprovadas que garantem disponibilidade, escalabilidade e conformidade com os mais exigentes padrões de segurança e privacidade de dados.
Os gatilhos do Atlas de banco de dados permitem a execução da lógica do lado do servidor sempre que um documento passa por adição, modificação ou exclusão em um Atlas cluster conectado.
Ao contrário dos triggers de dados SQL convencionais confinados ao servidor de banco de dados, osAtlas Triggers operam em uma camada de computação sem servidor capaz de escalar automicamente a partir do servidor de banco de dados.
Ele invoca perfeitamente o Atlas Functions e também pode facilitar o encaminhamento de eventos para manipuladores externos por meio do Amazon EventBridge.
Um Atlas Trigger pode acionar em:
- Um tipo de operação específico em uma determinada coleção, como inserir, atualizar e excluir.
- Um evento de autenticação, como a criação ou exclusão do usuário.
- Um horário agendado, como uma tarefa CRON.
Existem três tipos de trigger no Atlas:
- Os gatilhos de banco de dados (trigger) são usados em cenários em que você deseja responder quando um documento é inserido, alterado ou excluído.
- Os gatilhos de autenticação podem ser usados onde você deseja responder quando um usuário do banco de dados é criado, conectado ou excluído.
- Os gatilhos programados agem como uma tarefa CRON e são executados em um cronograma predefinido.
Vamos comparar como os procedimentos armazenados podem ser implementados no SQL e no MongoDB usando triggers, funções e aggregation pipelines.
Aqui está um exemplo de um procedimento armazenado no MySQL que calcula a receita total do dia toda vez que um novo pedido é inserido em uma tabela de pedidos:
1 DELIMITER $$ 2 3 CREATE PROCEDURE UpdateTotalRevenueForToday() 4 BEGIN 5 DECLARE today DATE; 6 DECLARE total_revenue DECIMAL(10, 2); 7 8 -- Get today's date 9 SET today = CURDATE(); 10 11 -- Calculate total revenue for today 12 SELECT SUM(total_price) INTO total_revenue 13 FROM orders 14 WHERE DATE(order_date) = today; 15 16 -- Update total revenue for today in a separate table or perform any other necessary action 17 -- Here, I'm assuming you have a separate table named 'daily_revenue' to store daily revenue 18 -- If not, you can perform any other desired action with the calculated total revenue 19 20 -- Update or insert the total revenue for today into the 'daily_revenue' table 21 INSERT INTO daily_revenue (date, revenue) 22 VALUES (today, total_revenue) 23 ON DUPLICATE KEY UPDATE revenue = total_revenue; 24 END$$ 25 26 DELIMITER ;
Neste procedimento armazenado:
- Declaramos duas variáveis: today para armazenar a data de hoje e total_revenue para armazenar a receita total calculada para hoje.
- Usamos um comando SELECT para calcular a receita total de hoje a partir da tabela de pedidos em que order_date corresponde à data de hoje.
- Em seguida, atualizamos a tabela daily_revenue com a data de hoje e a receita total calculada. Se já houver uma entrada para a data de hoje, ela atualizará a receita. Caso contrário, insere uma nova linha para a data de hoje.
Agora, temos que criar um trigger para chamar esse procedimento armazenado toda vez que um novo pedido for inserido na tabela de pedidos. Aqui está um exemplo de como criar esse gatilho:
1 CREATE TRIGGER AfterInsertOrder 2 AFTER INSERT ON orders 3 FOR EACH ROW 4 BEGIN 5 CALL UpdateTotalRevenueForToday(); 6 END;
Esse trigger chamará o procedimento armazenado UpdateTotalRevenueForToday() toda vez que uma nova linha for inserida na tabela de pedidos.
Se você não tiver um MongoDB database existente implantado no Atlas, comece gratuitamente e obtenha 500MBs de armazenamento gratuito para sempre.
Agora, tudo o que precisamos fazer é criar um Atlas Trigger e implementar uma Atlas Function nele.
- Selecione o Tipo de Trigger como "Database ", pois queremos que nosso trigger responda a eventos do banco de dados em vez de em um agendamento definido.
- Dê a esse trigger um nome de sua escolha.
- Selecione uma Fonte de Dados à qual você deseja que este gatilho seja vinculado.
- Estamos monitorando um "Collection ", pois queremos que esse trigger seja executado toda vez que um novo documento for inserido na coleção de pedidos.
- Selecione o nome deCluster, Banco deDadose Coleçãoapropriado onde você deseja que este trigger observe quaisquer alterações.
- Estamos interessados apenas em que novos pedidos sejam criados em nosso aplicativo, portanto, escolheremos apenas "Insert Document " em Tipo de operação.
- Ative a opçãoDocumento completo para esse trigger.
- Você pode manter as outras opções em seu estado padrão. Saiba mais sobre como configurar os acionadores do banco de dados do Atlas.
Finalmente, implementaremos a seguinte Atlas Function no editor de funções:
1 exports = async function (changeEvent) { 2 //Get the date from the newly inserted document 3 const date = changeEvent.fullDocument.order_date; 4 const ordersCollection = context.services.get("triggers-demo").db("business").collection("orders"); 5 const dailyRevenueCollection = context.services.get("triggers-demo").db("business").collection("daily_revenue"); 6 7 const pipeline = [ 8 { 9 $group: { 10 _id: date, 11 total_revenue: { $sum: "$total_amount" } 12 } 13 } 14 ]; 15 16 const result = await ordersCollection.aggregate(pipeline).toArray(); 17 const totalRevenue = result.length > 0 ? result[0].total_revenue : 0; 18 19 await dailyRevenueCollection.updateOne( 20 { date: date }, 21 { $set: { revenue: totalRevenue } }, 22 { upsert: true } 23 ); 24 };
Pressione "Save."
Agora, para testar se nosso trigger está funcionando corretamente, vamos inserir um documento em nossa collection de pedidos:
1 { 2 "_id": { "$oid": "65c357c89b2a791ae372bce3" }, 3 "order_date": "07-02-2024", 4 "total_amount": 1499 5 }
Para verificar se nosso trigger foi executado com êxito, podemos verificar a dailyRevenue collection, e, se ela contiver um novo documento com a mesma data que usamos no pedido recém-inserido, parabéns - você implementou com êxito um trigger Atlas totalmente funcional.
Normalmente, você usaria um procedimento armazenado em SQL quando estivesse tentando executar queries complexas no banco de dados com frequência.
Os procedimentos armazenados foram inicialmente elogiados por suas vantagens percebidas em termos de desempenho, eficiência e segurança. No entanto, suas desvantagens — incluindo desafios de manutenção, portabilidade limitada e funções confusas entre desenvolvedores e administradores de banco de dados — tornaram-se cada vez mais aparentes nos paradigmas arquitetônicos modernos.
Por outro lado, o MongoDB torna incrivelmente fácil trabalhar com dados. Ele fornece ferramentas e técnicas modernas que nos ajudam a criar aplicativos orientados a eventos extraordinariamente rápidos.
As funcionalidades doMongoDB , como aggregation pipelines e change streams, são alternativas poderosas aos procedimentos armazenados tradicionais. O MongoDB Atlas, a plataforma de dados para desenvolvedores, aumenta ainda mais a flexibilidade de desenvolvimento com recursos como Atlas Functions e Atlas Triggers, permitindo a integração perfeita da lógica do lado do servidor dentro do ambiente de banco de dados.
A migração de procedimentos armazenados para MongoDB não é apenas uma mudança tecnologia; representa uma mudança de paradigma no sentido de abranger um cenário digital pronto para o futuro. À medida que as organizações fazem a transição, elas obtêm a capacidade de aproveitar as soluções avançadas do MongoDB, mantendo a agilidade, melhorando o desempenho e aderindo às práticas de desenvolvimento Contemporâneas.
Então, o que você está esperando? Cadastre-se no Atlas hoje mesmo e experimente a alternativa moderna aos procedimentos armazenados no MongoDB.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.