Los activadores programados le permiten ejecutar la lógica del lado del servidor en un Programación regular que usted defina. Puede usar activadores programados para realizar tareas periódicas, como actualizar un documento cada minuto, generar un informe nocturno o enviar un boletín informativo semanal automatizado por correo electrónico.
Crear un disparador programado
Puede crear un nuevo activador programado desde la interfaz de usuario de Atlas o mediante la CLI de App Services.
En Atlas, vaya a la Triggers página.
Si aún no aparece, se debe seleccionar la organización que contiene el proyecto en el menú Organizations de la barra de navegación.
Si aún no se muestra, seleccione su proyecto en el menú Projects de la barra de navegación.
En la barra lateral, haz clic en Triggers en la sección Streaming Data.
Haga clic en Add Trigger para abrir la página de configuración del disparador.
Seleccione Scheduled Tipo de disparador.
Configure el disparador y luego haga clic en Save.
Autenticar un usuario de MongoDB Atlas:
Utilice su Clave API de administración de MongoDB Atlas para iniciar sesión en la CLI de App Services:
appservices login --api-key="<API KEY>" --private-api-key="<PRIVATE KEY>" Extraiga los últimos archivos de configuración de su aplicación:
Ejecute el siguiente comando para obtener una copia local de sus archivos de configuración:
appservices pull --remote=<App ID> De forma predeterminada, el comando extrae los archivos al directorio de trabajo actual. Puede especificar una ruta de directorio con el comando opcional
--localbandera.Agregue un archivo de configuración de disparador programado al
triggerssubdirectorio de su directorio de aplicación local.Nota
No se puede crear un disparador que se ejecute Basic según una programación mediante la CLI de App Services. Todas las configuraciones de disparadores programados importadas deben especificar una expresión CRON.
Los archivos de configuración de disparadores programados tienen el siguiente formato:
/triggers/<triggers name>.json{ "type": "SCHEDULED", "name": "<Trigger Name>", "function_name": "<Trigger Function Name>", "config": { "schedule": "<CRON expression>" }, "disabled": <boolean> } Implemente sus cambios:
Ejecute el siguiente comando para implementar sus cambios:
appservices push
Configuración
Los activadores programados tienen las siguientes opciones de configuración:
Campo | Descripción |
|---|---|
Trigger Type type: <string> | Seleccione Scheduled. |
Schedule Type config.schedule: <string> | Obligatorio. Puede seleccionar Basic o Advanced. Una programación básica ejecuta el disparador periódicamente según el intervalo que configure, como "cada cinco minutos" o "todos los lunes". Una programación avanzada ejecuta el disparador según la expresión CRON personalizada que usted defina. |
Skip Events on Re-Enable skip_catchup_event: <boolean> | Deshabilitado por defecto. Si está habilitado, no se procesarán los eventos de cambio que se hayan producido mientras este disparador estaba deshabilitado. |
Event Type function_name: <string> | Dentro de la sección Event Type, eliges la acción que se tomará cuando se active el activador. Puede elegir ejecutar una Función o usar AWS EventBridge. Un activador programado no pasa ningún argumento a su Función vinculada. |
Trigger Name name: <string> | El nombre del disparador. |
Expresiones CRON
Las expresiones CRON son cadenas definidas por el usuario que utilizan la sintaxis estándar de tareas cron para definir cuándo debe ejecutarse un disparador programado. Atlas ejecuta expresiones CRON de disparador según la hora UTC. Cuando todos los campos de una expresión CRON coinciden con la fecha y hora actuales, Atlas activa el disparador asociado a la expresión.
Sintaxis de expresión
Formato
Las expresiones CRON son cadenas compuestas por cinco campos delimitados por espacios. Cada campo define una parte detallada de la programación en la que se ejecuta su disparador asociado:
* * * * * │ │ │ │ └── weekday...........[0 (SUN) - 6 (SAT)] │ │ │ └──── month.............[1 (JAN) - 12 (DEC)] │ │ └────── dayOfMonth........[1 - 31] │ └──────── hour..............[0 - 23] └────────── minute............[0 - 59]
Campo | Valid Values | Descripción |
|---|---|---|
| [0 - 59] | Representa uno o más minutos dentro de una hora. Si el campo |
| [0 - 23] | Representa una o más horas dentro de un día en un reloj de 24horas. Si el campo |
| [1 - 31] | Representa uno o más días dentro de un mes. Si el campo |
| 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 uno o más meses dentro de un año. Un mes se puede representar mediante un número (por ejemplo, Si el campo |
| 0 (SUN)1 (MON)2 (TUE)3 (WED)4 (THU)5 (FRI)6 (SAT) | Representa uno o más días dentro de una semana. Un día de la semana se puede representar mediante un número (por ejemplo, Si el campo |
Valores de campo
Cada campo de una expresión CRON puede contener un valor específico o una expresión que evalúa un conjunto de valores. La siguiente tabla describe los valores de campo y las expresiones válidos:
Tipo de expresión | Descripción | |
|---|---|---|
All Values (*) | Coincide con todos los valores de campo posibles. Disponible en todos los campos de expresión. La siguiente expresión CRON programa un disparador para que se ejecute una vez cada minuto de cada día: | |
Specific Value (<Value>) | Coincide con un valor de campo específico. Para campos distintos de Disponible en todos los campos de expresión. La siguiente expresión CRON programa un disparador para que se ejecute una vez al día a las 11:00 AM UTC: | |
List of Values (<Expression1>,<Expression2>,...) | Coincide con una lista de dos o más expresiones de campo o valores específicos. Disponible en todos los campos de expresión. La siguiente expresión CRON programa un activador para que se ejecute una vez al día en enero, marzo y julio a las 11:00 AM UTC: | |
Range of Values (<Start Value>-<End Value>) | Coincide con un rango continuo de valores de campo entre dos valores de campo específicos inclusive. Disponible en todos los campos de expresión. La siguiente expresión CRON programa un disparador para que se ejecute una vez al día desde el 1de enero hasta fines de abril a las 11:00 AM UTC: | |
Modular Time Step (<Field Expression>/<Step Value>) | Coincide con cualquier momento en el que el valor del paso divide de manera uniforme el valor del campo sin resto (es decir, cuando Disponible en los campos de expresión La siguiente expresión CRON programa un disparador para que se ejecute en los minutos 0, 25y 50de cada hora: |
Ejemplo
Una tienda online desea generar un informe diario de todas las ventas del día anterior. Registra todos los pedidos de la colección store.orders como documentos similares a los siguientes:
{ _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") }, ] }
Campo | Configuración |
|---|---|
Trigger Type | Scheduled |
Schedule Type | Advanced |
Establecer un cronograma CHRON. |
|
{ "type": "SCHEDULED", "name": "reportDailyOrders", "function_name": "generateDailyReport", "config": { "schedule": "0 7 * * *" }, "disabled": false }
Para generar el informe diario, la tienda crea un activador programado que se activa todos los días a las 7:00 AM UTC. Cuando se activa el activador, llama a su Atlas Function vinculada, generateDailyReport, que ejecuta una query de agregación en la colección store.orders para generar el informe. La función luego almacena el resultado de la agregación en la colección 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; }
Optimización del rendimiento
Usa la API de consulta con una expresión $match para reducir la cantidad de documentos que tu función examina. Esto ayuda a mejorar el rendimiento de tu función y a no alcanzar los límites de memoria.
Consulte también la sección Ejemplo para ver un disparador programado que utiliza una expresión $match.