On this page
- Create a Scheduled Trigger
- Configuration
- CRON Expressions
- Expression Syntax
- Format
- Field Values
- Example
- Performance Optimization
- Additional Examples
Atlas Device Sync, Atlas Edge Server, Data API, and HTTPS Endpoints are deprecated. Refer to the
Scheduled triggers allow you to execute server-side logic on aregular schedule that you define.You can use scheduled triggers to do work that happens on a periodicbasis, such as updating a document every minute, generating a nightlyreport, or sending an automated weekly email newsletter.
Create a Scheduled Trigger
To create a scheduled Trigger in the Atlas App Services UI:
Click Triggers under Build in theleft navigation menu.
Click Add a Trigger to open the Trigger configuration page.
Select Scheduled for the Trigger Type.
click to enlarge
To create a scheduled Trigger with the App Services CLI:
Add a scheduled Trigger configuration file to the
triggers
subdirectory of a localapplication directory.Note
You cannot create a Trigger that runs on a Basicschedule using App Services CLI. All imported scheduled Triggerconfigurations must specify a CRON expression.
Scheduled Trigger configuration files have the following form:
/triggers/<triggers name>.json
{ "type": "SCHEDULED", "name": "<Trigger Name>", "function_name": "<Trigger Function Name>", "config": { "schedule": "<CRON expression>" }, "disabled": <boolean> } Deploy the trigger:
appservices push
Configuration
Scheduled Triggers have the following configuration options:
Field | Description |
---|---|
Trigger Type
| Select Scheduled. |
Name
| The name of the trigger. |
Enabled
| Enabled by default. Used to enable or disable the trigger. |
Skip Events on Re-Enable
| Disabled by default. If enabled, any change events that occurred whilethis trigger was disabled will not be processed. |
Schedule Type
| Required. You can select Basic or Advanced. A Basicschedule executes the Trigger periodically based on the interval you set,such as "every five minutes" or "every Monday". An Advanced schedule runs the Trigger based on the customCRON expression that you define. |
Function
| Within the Function section, you choose what action is taken whenthe trigger fires. You can choose to run a function or useAWS EventBridge. NoteA Scheduled Trigger does not pass any arguments to its linkedFunction. |
CRON Expressions
CRON expressions are user-defined strings that use standardcron job syntax to define when a scheduledtrigger should execute.App Services executes Trigger CRON expressions based on UTC time.Whenever all of the fields in a CRON expression match the current date and time,App Services fires the trigger associated with the expression.
Expression Syntax
Format
CRON expressions are strings composed of five space-delimited fields.Each field defines a granular portion of the schedule on which itsassociated trigger executes:
* * * * * │ │ │ │ └── weekday...........[0 (SUN) - 6 (SAT)] │ │ │ └──── month.............[1 (JAN) - 12 (DEC)] │ │ └────── dayOfMonth........[1 - 31] │ └──────── hour..............[0 - 23] └────────── minute............[0 - 59]
Field | Valid Values | Description |
---|---|---|
| [0 - 59] | Represents one or more minutes within an hour. ExampleIf the |
| [0 - 23] | Represents one or more hours within a day on a 24-hour clock. ExampleIf the |
| [1 - 31] | Represents one or more days within a month. ExampleIf the |
|
| Represents one or more months within a year. A month can be represented by either a number (e.g. ExampleIf the |
|
| Represents one or more days within a week. A weekday can be represented by either a number (e.g. ExampleIf the |
Field Values
Each field in a CRON expression can contain either a specific value oran expression that evaluates to a set of values. The following tabledescribes valid field values and expressions:
Expression Type | Description |
---|---|
All Values
| Matches all possible field values. Available in all expression fields. ExampleThe following CRON expression schedules a trigger to executeonce every minute of every day:
|
Specific Value
| Matches a specific field value. For fields other than Available in all expression fields. ExampleThe following CRON expression schedules a trigger to executeonce every day at 11:00 AM UTC:
|
List of Values
| Matches a list of two or more field expressions or specificvalues. Available in all expression fields. ExampleThe following CRON expression schedules a trigger to executeonce every day in January, March, and July at 11:00 AM UTC:
|
Range of Values
| Matches a continuous range of field values between and includingtwo specific field values. Available in all expression fields. ExampleThe following CRON expression schedules a trigger to executeonce every day from January 1st through the end of April at11:00 AM UTC:
|
Modular Time Step
| Matches any time where the step value evenly divides thefield value with no remainder (i.e. when Available in the ExampleThe following CRON expression schedules a trigger to executeon the 0th, 25th, and 50th minutes of every hour:
|
Example
An online store wants to generate a daily report of all sales from theprevious day. They record all orders in the store.orders
collectionas documents that resemble the following:
{ _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") }, ] }
To generate the daily report, the store creates a scheduled Triggerthat fires every day at 7:00 AM UTC
. When theTrigger fires, it calls its linked Atlas Function,generateDailyReport
, which runs an aggregationquery on the store.orders
collection to generate the report. TheFunction then stores the result of the aggregation in thestore.reports
collection.
Trigger Configuration
{ "type": "SCHEDULED", "name": "reportDailyOrders", "function_name": "generateDailyReport", "config": { "schedule": "0 7 * * *" }, "disabled": false }
generateDailyReport
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; }
Performance Optimization
Use the Query API with a a $matchexpression to reduce the number of documents your Function looks at.This helps your Function improve performance and not reachFunction memory limits.
Refer the Example section for a Scheduled Trigger using a $match expression.
Additional Examples
For additional examples of Triggers integrated into an App Services App,checkout the example Triggers on Github.