Docs Menu

Scheduled Triggers

On this page

  • Overview
  • Example
  • Configuration
  • CRON Expressions
  • Expression Syntax
  • Format
  • Field Values

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.

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 morning at 7:00 AM UTC-0400. When the Trigger fires, it calls its linked Realm Function, generateDailyReport, which runs an aggregation query on the store.orders collection to generate the report. The Realm Function then stores the result of the aggregation in the store.reports collection.

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;
}

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 SCHEDULED.

Trigger Name
name: <string>
Required. The name of the Trigger.
Linked Function
function_name: <string>

Required. The name of the Realm Function that the Trigger executes whenever it fires.

Note

A scheduled Trigger does not pass any arguments to its linked Function.

Schedule
config.schedule: <string>
Required. The CRON expression that MongoDB Realm uses to determine when to fire the Trigger.

CRON expressions are user-defined strings that use standard cron job syntax to define when a scheduled trigger should execute. Whenever all of the fields in a CRON expression match the current date and time, MongoDB Realm fires the trigger associated with the expression.

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.

Example

If the minute field of a CRON expression has a value of 10, the field matches any time ten minutes after the hour (e.g. 9:10 AM).

hour
[0 - 23]

Represents one or more hours within a day on a 24-hour clock.

Example

If the hour field of a CRON expression has a value of 15, the field matches any time between 3:00 PM and 3:59 PM.

dayOfMonth
[1 - 31]

Represents one or more days within a month.

Example

If the dayOfMonth field of a CRON expression has a value of 3, the field matches any time on the third day of the month.

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. 2 for February) or a three-letter string (e.g. APR for April).

Example

If the month field of a CRON expression has a value of 9, the field matches any time in the month of September.

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. 2 for a Tuesday) or a three-letter string (e.g. THU for a Thursday).

Example

If the weekday field of a CRON expression has a value of 3, the field matches any time on a Wednesday.

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.

Example

The 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 weekday and month this value will always be an integer. A weekday or month field can be either an integer or a three-letter string (e.g. TUE or AUG).

Available in all expression fields.

Example

The following CRON expression schedules a trigger to execute once every day at 11:00 AM UTC:

0 11 * * *
List of Values
(<Expression1>,<Expression2>,...)

Matches a list of two or more field expressions or specific values.

Available in all expression fields.

Example

The following CRON expression schedules a trigger to execute once every day in January, March, and July at 11:00 AM UTC:

0 11 * 1,3,7 *
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.

Example

The following CRON expression schedules a trigger to execute once every day from January 1st through the end of April at 11:00 AM UTC:

0 11 * 1-4 *
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 Value % Step == 0).

Available in the minute and hour expression fields.

Example

The following CRON expression schedules a trigger to execute on the 0th, 25th, and 50th minutes of every hour:

*/25 * * * *
Give Feedback
© 2021 MongoDB, Inc.

About

  • Careers
  • Legal Notices
  • Privacy Notices
  • Security Information
  • Trust Center
© 2021 MongoDB, Inc.