Docs Home → Atlas App Services
Scheduled Triggers
On this page
Scheduled triggers allow you to execute server-side logic on a regular schedule that you define. You can use scheduled triggers to do work that happens on a periodic basis, such as updating a document every minute, generating a nightly report, or sending an automated weekly email newsletter.
Create a Scheduled Trigger
Configuration
Scheduled Triggers have the following configuration options:
Field | Description |
---|---|
Trigger Type type: <string> | Required. The type of the Trigger. For scheduled Triggers, this value should be set to |
Trigger Name name: <string> | Required. The name of the Trigger. |
Linked Function function_name: <string> | Required. The name of the Function that the Trigger executes whenever it fires. NoteA scheduled Trigger does not pass any arguments to its linked Function. |
Schedule config.schedule: <string> | Required. The CRON expression
that Atlas App Services uses to determine when to fire the Trigger. |
CRON Expressions
CRON expressions are user-defined strings that use standard cron job syntax to define when a scheduled trigger 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 its associated 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 |
---|---|---|
minute | [0 - 59] | Represents one or more minutes within an hour. ExampleIf the |
hour | [0 - 23] | Represents one or more hours within a day on a 24-hour clock. ExampleIf the |
dayOfMonth | [1 - 31] | Represents one or more days within a month. ExampleIf the |
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) | Represents one or more months within a year. A month can be represented by either a number (e.g. ExampleIf the |
weekday | 0 (SUN) 1 (MON) 2 (TUE) 3 (WED) 4 (THU) 5 (FRI) 6 (SAT) | 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 or an expression that evaluates to a set of values. The following table describes 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 execute once every minute of every day:
| |
Specific Value (<Value>) | Matches a specific field value. For fields other than Available in all expression fields. ExampleThe following CRON expression schedules a trigger to execute once every day at 11:00 AM UTC:
| |
List of Values (<Expression1>,<Expression2>,...) | Matches a list of two or more field expressions or specific values. Available in all expression fields. ExampleThe following CRON expression schedules a trigger to execute once every day in January, March, and July at 11:00 AM UTC:
| |
Range of Values (<Start Value>-<End Value>) | Matches a continuous range of field values between and including two specific field values. Available in all expression fields. ExampleThe following CRON expression schedules a trigger to execute once every day from January 1st through the end of April at 11:00 AM UTC:
| |
Modular Time Step (<Field Expression>/<Step Value>) | Matches any time where the step value evenly divides the
field value with no remainder (i.e. when Available in the ExampleThe following CRON expression schedules a trigger to execute on the 0th, 25th, and 50th minutes of every hour:
|
Example
An online store wants to generate a daily report of all sales from the
previous day. They record all orders in the store.orders
collection
as 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 Trigger
that fires every day at 7:00 AM UTC
. When the
Trigger fires, it calls its linked Atlas Function,
generateDailyReport
, which runs an aggregation
query on the store.orders
collection to generate the report. The
Function then stores the result of the aggregation in the
store.reports
collection.
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 $match expression to reduce the number of documents your Function looks at. This helps your Function improve performance and not reach Function 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.