Gatilhos programados
Nesta página
Os scheduled triggers permitem executar a lógica do lado do servidor em umaprogramação regular definida por você. Você pode usar os triggers programados para realizar trabalho que ocorre de modo periódico, como atualizar um documento a cada minuto, gerando um relatório por noite, enviando uma newsletter semanal por e-mail.
Criar um gatilho programado
Você pode criar um novo trigger agendado a partir da UI do Atlas ou usando a App Services CLI.
Navegue até a Página Triggers
Se ainda não tiver sido exibido, selecione a organização que contém seu projeto no menu Organizations na barra de navegação.
Se ainda não estiver exibido, selecione seu projeto no menu Projects na barra de navegação.
Na barra lateral, clique em Triggers sob o título Services.
A página Acionadores é exibida.
Clique em Add Trigger para abrir a página de configuração do trigger.
Selecione o tipo de trigger Scheduled.
Configure o trigger e clique em Save.
Autentique um usuário do MongoDB Atlas :
Use suachave de API de administração do MongoDB Atlas para fazer login na App Services CLI:
appservices login --api-key="<API KEY>" --private-api-key="<PRIVATE KEY>" Extraia os arquivos de configuração mais recentes do seu aplicativo:
Execute o seguinte comando para obter uma cópia local dos seus arquivos de configuração:
appservices pull --remote=<App ID> Por padrão, o comando extrai arquivos para o diretório de trabalho atual. Você pode especificar um caminho de diretório com o sinalizador
--local
opcional.Adicione um trigger arquivo de configuração
triggers
de scheduled no subdiretório do seu diretório de aplicação local.Observação
Não é possível criar um trigger que é executado em uma programação Basic usando a App Services CLI. Todas as configurações de trigger agendadas importadas devem especificar uma expressão CRON .
Os arquivos de configuração do trigger agendado têm o seguinte formato:
/triggers/<triggers name>.json{ "type": "SCHEDULED", "name": "<Trigger Name>", "function_name": "<Trigger Function Name>", "config": { "schedule": "<CRON expression>" }, "disabled": <boolean> } Distribua suas alterações:
Execute o seguinte comando para implementar suas alterações:
appservices push
Configuração
Os Triggers Agendados têm as seguintes opções de configuração:
Campo | Descrição |
---|---|
Trigger Type type: <string> | Selecione Scheduled. |
Schedule Type config.schedule: <string> | Obrigatório. Você pode selecionar Basic ou Advanced. Uma agenda Básica executa o Trigger periodicamente com base no intervalo definido, como "a cada cinco minutos" ou "toda segunda-feira". Uma programação avançada executa o acionador com base na expressão CRON personalizada que você define. |
Skip Events on Re-Enable skip_catchup_event: <boolean> | Desabilitado por padrão. Se habilitado, quaisquer eventos de alteração ocorridos enquanto esse trigger esteve desabilitado não serão processados. |
Event Type function_name: <string> | Na seção Event Type, você escolhe qual ação será executada quando o trigger for acionado. Você pode optar por executar uma função ou usar o AWS EventBridge. Um Trigger Agendado não passa nenhum argumento para sua Função vinculada. |
Trigger Name name: <string> | O nome do trigger. |
Expressões de CRON
As expressões CRON são strings definidas pelo usuário que utilizam cron padrão sintaxe de tarefa para definir quando um trigger agendado deve ser executado. O Atlas executa expressões Trigger CRON com base na horaUTC . Sempre que todos os campos em uma expressão CRON coincidem com a data e a hora atuais, o Atlas aciona o Trigger associado à expressão.
Sintaxe de Expressão
Formatar
Expressões CRON são strings compostas de cinco campos delimitados por espaço. Cada campo define uma parte granular da agenda na qual seu trigger associado é executado:
* * * * * │ │ │ │ └── weekday...........[0 (SUN) - 6 (SAT)] │ │ │ └──── month.............[1 (JAN) - 12 (DEC)] │ │ └────── dayOfMonth........[1 - 31] │ └──────── hour..............[0 - 23] └────────── minute............[0 - 59]
Campo | Valid Values | Descrição |
---|---|---|
minute | [0 - 59] | Representa um ou mais minutos em uma hora. Se o campo |
hour | [0 - 23] | Representa uma ou mais horas dentro de um dia em um relógio de 24 horas. Se o campo |
dayOfMonth | [1 - 31] | Representa um ou mais dias em um mês. Se o campo |
month | 1 (JAN) 7 (JUL) 2 (FEB) 8 (AUG) 3 (MAR) 9 (SEP) 4 (APR) 10 (OCT) 5 (MAY) 11 (NOV) 6 (JUN) 12 (DEC) | Representa um ou mais meses dentro de um ano. Um mês pode ser representado por um número (por exemplo, Se o campo |
weekday | 0 (SUN) 1 (MON) 2 (TUE) 3 (WED) 4 (THU) 5 (FRI) 6 (SAT) | Representa um ou mais dias em uma semana. Um dia da semana pode ser representado por um número (por exemplo, Se o campo |
Valores do Campo
Cada campo em uma expressão CRON pode conter um valor específico ou uma expressão que avalia para um conjunto de valores. A tabela a seguir descreve valores e expressões de campos válidos:
Tipo de Expressão | Descrição | |
---|---|---|
All Values (*) | Corresponde a todos os valores de campo possíveis. Disponível em todos os campos de expressão. A expressão CRON a seguir programa um trigger para ser executado uma vez a cada minuto todos os dias:
| |
Specific Value (<Value>) | Corresponde a um valor de campo específico. Para campos diferentes de Disponível em todos os campos de expressão. A seguinte expressão CRON agenda um trigger para ser executado uma vez por dia às 11:00 AM UTC:
| |
List of Values (<Expression1>,<Expression2>,...) | Corresponde a uma lista de duas ou mais expressões de campo ou valores específicos. Disponível em todos os campos de expressão. A expressão CRON a seguir programa um trigger para ser executado uma vez por dia em janeiro, março e julho às 11:00 AM UTC:
| |
Range of Values (<Start Value>-<End Value>) | Corresponde a uma faixa contínua de valores entre campos, incluindo dois valores de campo específicos. Disponível em todos os campos de expressão. A expressão CRON a seguir programa um trigger para ser executado uma vez por dia, de 1janeiro até o final de abril às 11:00 AM UTC:
| |
Modular Time Step (<Field Expression>/<Step Value>) | Corresponde a qualquer momento em que o valor da etapa divide uniformemente o valor do campo sem nenhum restante (ou seja, quando Disponível nos campos de expressão A expressão CRON a seguir programa um trigger para ser executado nos 0th, 25th e 50th minutos de cada hora:
|
Exemplo
Uma loja online deseja gerar um relatório diário de todas as vendas do dia anterior. Ela registra todas as ordens na collection store.orders
como documentos que se assemelham ao seguinte:
{ _id: ObjectId("59cf1860a95168b8f685e378"), customerId: ObjectId("59cf17e1a95168b8f685e377"), orderDate: ISODate("2018-06-26T16:20:42.313Z"), shipDate: ISODate("2018-06-27T08:20:23.311Z"), orderContents: [ { qty: 1, name: "Earl Grey Tea Bags - 100ct", price: Decimal128("10.99") } ], shippingLocation: [ { location: "Memphis", time: ISODate("2018-06-27T18:22:33.243Z") }, ] }
{ "type": "SCHEDULED", "name": "reportDailyOrders", "function_name": "generateDailyReport", "config": { "schedule": "0 7 * * *" }, "disabled": false }
Para gerar o relatório diário, a loja cria um Trigger agendado que dispara todos os dias às 7:00 AM UTC
. Quando o Trigger é acionado, ele chama sua função Atlas Function vinculada, generateDailyReport
, que executa uma consulta de agregação na coleção store.orders
para gerar o relatório. A Função então armazena o resultado da agregação na coleção store.reports
.
exports = function() { // Instantiate MongoDB collection handles const mongodb = context.services.get("mongodb-atlas"); const orders = mongodb.db("store").collection("orders"); const reports = mongodb.db("store").collection("reports"); // Generate the daily report return orders.aggregate([ // Only report on orders placed since yesterday morning { $match: { orderDate: { $gte: makeYesterdayMorningDate(), $lt: makeThisMorningDate() } } }, // Add a boolean field that indicates if the order has already shipped { $addFields: { orderHasShipped: { $cond: { if: "$shipDate", // if shipDate field exists then: 1, else: 0 } } } }, // Unwind individual items within each order { $unwind: { path: "$orderContents" } }, // Calculate summary metrics for yesterday's orders { $group: { _id: "$orderDate", orderIds: { $addToSet: "$_id" }, numSKUsOrdered: { $sum: 1 }, numItemsOrdered: { $sum: "$orderContents.qty" }, totalSales: { $sum: "$orderContents.price" }, averageOrderSales: { $avg: "$orderContents.price" }, numItemsShipped: { $sum: "$orderHasShipped" }, } }, // Add the total number of orders placed { $addFields: { numOrders: { $size: "$orderIds" } } } ]).next() .then(dailyReport => { reports.insertOne(dailyReport); }) .catch(err => console.error("Failed to generate report:", err)); }; function makeThisMorningDate() { return setTimeToMorning(new Date()); } function makeYesterdayMorningDate() { const thisMorning = makeThisMorningDate(); const yesterdayMorning = new Date(thisMorning); yesterdayMorning.setDate(thisMorning.getDate() - 1); return yesterdayMorning; } function setTimeToMorning(date) { date.setHours(7); date.setMinutes(0); date.setSeconds(0); date.setMilliseconds(0); return date; }
Otimização de desempenho
Use a API de query com uma expressão a $match para reduzir o número de documentos examinados pela Função. Isso ajuda sua função a melhorar o desempenho e não atingir os limites de memória da função.
Consulte também a seção Exemplo de um trigger agendado usando uma expressão$match.