Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Saiba por que o MongoDB foi selecionado como um líder no 2024 Gartner_Magic Quadrupnt()
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Atlaschevron-right

Realm Atlas Triggers Mimos e Triggers - Agendamento trigger baseado em documentos

Pavel Duchovny5 min read • Published Dec 20, 2021 • Updated Sep 09, 2024
Atlas
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
Alguns recursos mencionados abaixo serão descontinuados em 30, 2025 de setembro. Saiba mais.
Nesta série de blogs, estamos tentando inspirá-lo com alguns casos de uso reativos do Realm trigger. Esperemos que isto o ajude a levar os seus pipelines de aplicação para o próximo nível.
Essencialmente, os gatilhos são componentes em nossos aplicativos Atlas Projects/Realm que permitem ao usuário definir uma função personalizada a ser invocada em um evento específico.
  • Gatilhos de banco de dados: temos gatilhos que podem ser agendados com base em eventos de banco de dados, como deletes, inserts, updatese replaces- chamados de gatilhos de banco de dados.
  • Triggers programados: podemos agendar um trigger com base em uma expressão cronpor meiode triggers programados.
  • Gatilhos de autenticação: esses gatilhos são relevantes apenas para autenticação de Realm. Eles são acionados por um dos eventos de autenticação dos provedores de autenticação do Realm e podem ser configurados apenas por meio de um aplicativo do Realm.
Para esta postagem do blog, gostaria de me concentrar nos padrões de agendamento de trigger.
Deixe-me apresentar um caso de uso e veremos como a mecânica discutida pode nos ajudar nesse cenário. Considere um aplicativo de gerenciamento de reuniões que agenda reuniões e, como parte de sua funcionalidade, precisa notificar um usuário 10 minutos antes da reunião.
Como criaríamos um trigger que seria acionado 10 minutos antes de um carimbo de data/hora que só é conhecido pelo documento " meeting "?
Primeiro, vamos dar uma olhada no exemplo de documentos da coleção de sessões:
1{
2 _id : ObjectId("5ca4bbcea2dd94ee58162aa7"),
3 event : "Mooz Meeting",
4 eventDate : ISODate("2021-03-20:14:00:00Z"),
5 meetingUrl : "https://mooz.meeting.com/5ca4bbcea2dd94ee58162aa7",
6 invites : ["jon.doe@myemail.com", "doe.jonas@myemail.com"]
7 }
Queira compartilhar uma solução interessante com base em triggers e, ao longo deste artigo, usaremos um exemplo de notificação de reunião para explicar a abordagem discutida.

Pré-requisitos

Primeiro, verifique se você tem um projeto do Atlas com privilégios de proprietário para criar triggers.
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.

A ideia por trás do mecanismo principal

Usarei o exemplo de evento como um documento de origem iniciando o fluxo com uma inserção em uma collectionmeetings:
1{
2 _id : ObjectId("5ca4bbcea2dd94ee58162aa7"),
3 event : "Mooz Meeting",
4 eventDate : ISODate("2021-03-20:11:00:00Z"),
5 meetingUrl : "https://mooz.meeting.com/5ca4bbcea2dd94ee58162aa7"
6 invites : ["jon.doe@example.com"],
7 phone : "+123456789"
8}
Depois de inserirmos este documento na collectionmeetings, ele criará o seguinte registro em uma collection auxiliar chamada notifications usando um trigger de inserção:
1{
2 _id : ObjectId("5ca4bbcea2dd94ee58162aa7"),
3 triggerDate : ISODate("2021-03-10:50:00:00Z")
4}
A hora e _id são calculadas a partir do documento de origem e têm como objetivo disparar quando 2021-03-10:50:00:00Z chegar por meio de um trigger fireScheduleTasks . Esse trigger é baseado em uma operação de exclusão de umTTL no campo triggerDate do notifications.
É quando o usuário recebe o alerta!
Em um alto nível, aqui está o fluxo descrito acima.
Um documento de reunião é rastreado por um trigger, criando um documento de notificação. Este documento, no horário especificado, causará um evento de exclusão. A exclusão disparará um trigger de notificação para notificar o usuário.
Um documento de reunião é rastreado por um trigger, criando um documento de notificação. Este documento, no horário especificado, causará um evento de exclusão. A exclusão disparará um trigger de notificação para notificar o usuário.
Existem três componentes principais que permitem que nosso sistema seja trigger com base nos dados do documento.

1. Definir uma coleção auxiliar de notificações

Primeiro, precisamos preparar nossa coleçãonotifications. Esta coleção será criada implicitamente pelo seguinte comando de criação de índice.
Agora criaremos um índice TTL. Esse índice fará com que o documento de agendamento expire quando o valor no campotriggerDate chegar a sua vida útil de expiração de 0 segundos após seu valor.
1db.notifications.createIndex( { "triggerDate": 1 }, { expireAfterSeconds: 0 } )

2. Criando um trigger para preencher a collection de agendamento

Ao configurar seu triggerscheduleTasks, certifique-se de fornecer o seguinte:
  1. Serviço Atlas vinculado e verifique seu nome.
  2. O nome do banco de dados e da coleção em que baseamos o agendamento, por exemplo, meetings.
  3. A operação de trigger relevante que queremos agendar, por exemplo, quando um evento é inserido.
  4. Vincule-o a uma função que executará a population de collection de cronograma.
A configuração da interface do usuário do trigger para preencher a collection de agendamento.
A configuração da interface do usuário do trigger para preencher a collection de agendamento.
Para preencher a coleçãonotificationscom datas de acionamento relevantes, precisamos monitorar nossos documentos na coleção de origem. No nosso caso, os dados da próxima reunião do usuário são armazenados na coleção "meeting" com o campo userId. Nosso acionador monitorará as inserções para preencher um documento Scheduled.
1exports = function(changeEvent) {
2 // Get the notifications collection
3 const coll = context.services.get("<ATLAS-SERVICE>").db("<DATABASE>").collection("notifications");
4
5 // Calculate the "triggerDate" and populate the trigger collection and duplicate the _id
6 const calcTriggerDate = new Date(changeEvent.fullDocument.eventDate - 10 * 60000);
7 return coll.insertOne({_id:changeEvent.fullDocument._id,triggerDate: calcTriggerDate });
8};
Importante: Substitua <ATLAS-SERVICE> e <DATABASE> pelos seus nomes de serviço e banco de dados vinculados.

3. Construindo o trigger para executar a ação na "data do trigger"

Para React ao TTL "delete" event que acontece exatamente quando queremos que nossa tarefa agendada seja executada, precisamos usar um trigger de banco de dados "na exclusão" que chamei fireScheduleTasks.
Ao configurar seu triggerfireScheduleTasks, certifique-se de fornecer o seguinte:
  1. Serviço Atlas vinculado e verifique seu nome.
  2. O banco de dados e a coleção de notificações, por exemplo, notifications.
  3. A operação de trigger relevante que queremos agendar, que é "DELETE".
  4. Vincule-o a uma função que executará a tarefa disparada.
Agora que preenchemos a coleçãonotifications com o triggerDate, sabemos que o índice TTL disparará um evento de "exclusão" com o _idexcluído relevante para que possamos agir em nossa tarefa.
No meu caso, 10 minutos antes do início do evento do usuário, meu documento atingirá sua vida útil e enviarei uma mensagem de texto usando o serviço Twilio para o telefone do participante.
Um pré-requisito para esse estágio será configurar um serviço do Twilio usando suas credenciais de cloud do Twilio.
  1. Certifique-se de ter uma conta de cloud do Twilio com seu SID e seu token de autenticação.
  2. Configure o token SID e Auth na configuração de serviço Realm Twilio.
  3. Configure seu serviço e número de telefone doTwilio Messaging .
Depois de implementá-lo, podemos usá-lo para enviar notificações por SMS aos nossos convidados.
1exports = async function(changeEvent) {
2 // Get meetings collection
3 const coll = context.services.get("<ATLAS-SERVICE>").db("<DATABASE>").collection("meetings");
4
5 // Read specific meeting document
6 const doc = await coll.findOne({ _id: changeEvent.documentKey._id});
7
8 // Send notification via Twilio SMS
9 const twilio = context.services.get("<TWILIO-SERVICE>");
10 twilio.send({
11 to: doc.phone,
12 from: "+123456789",
13 body: `Reminder : Event ${doc.event} is about to start in 10min at ${doc.scheduledOn}`
14 });
15};
Importante: Substitua <ATLAS-SERVICE> e <DATABASE> pelos seus nomes de serviço e banco de dados vinculados.
Foi assim que o evento foi disparado no momento apropriado.

Embrulhar

Com a técnica apresentada, podemos aproveitar os padrões de trigger existentes para criar novos. Isso pode abrir sua mente para outras ideias para projetar seus próximos fluxos no MongoDB Realm.
No seguinte artigo desta série, aprenderemos como podemos implementar o incremento automático com triggers.
Se tiver dúvidas, acesse o site da nossa comunidade de desenvolvedores, no qual os engenheiros e a comunidade do MongoDB ajudarão você a desenvolver sua próxima grande ideia com o MongoDB.

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Início rápido

Como conectar o MongoDB Atlas ao Vercel usando a nova integração


Aug 05, 2024 | 4 min read
Tutorial

Adicione abreviações postais dos EUA à sua pesquisa do Atlas em 5 minutos


Sep 29, 2022 | 9 min read
Início rápido

Início rápido: Introdução ao MongoDB Atlas e Python


Apr 10, 2024 | 4 min read
Vídeo

A cena do Atlas Search: Temporada 1


Sep 11, 2024 | 2 min
Sumário