Docs 菜单
Docs 主页
/
MongoDB Atlas
/ /

定时触发器

在此页面上

  • 创建定时触发器
  • 配置
  • CRON 表达式
  • 表达式事务语法
  • format
  • 字段值
  • 例子
  • 性能优化

定时触发器允许您按照您定义的定期安排执行服务器端逻辑。您可以使用定时触发器来执行定期发生的工作,例如每分钟更新文档、生成夜间报告或发送自动每周电子邮件新闻简报。

您可以从Atlas用户界面或使用App Services CLI创建新的定时触发器。

  1. 导航至 Triggers页面

    1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。

    2. 如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。

    3. 在侧边栏中,单击Services标题下的Triggers

      此时将显示“触发器”页面。

  2. 单击 Add Trigger 打开触发器配置页面。

  3. 选择Scheduled触发器类型。

  4. 配置触发器,然后单击Save

/images/trigger-example-scheduled.png
  1. 对MongoDB Atlas用户进行身份验证:

    使用您的 MongoDB Atlas Administration API密钥登录到App Services CLI:

    appservices login --api-key="<API KEY>" --private-api-key="<PRIVATE KEY>"
  2. 拉取应用的最新配置文件:

    运行以下命令以获取配置文件的本地副本:

    appservices pull --remote=<App ID>

    默认,该命令会将文件提取到当前工作目录中。您可以使用可选的 --local标志指定目录路径。

  3. 将定时触发器配置文件添加到本地应用程序目录的triggers子目录中。

    注意

    您无法使用App Services CLI创建按Basic安排运行的触发器。所有导入的定时触发器配置都必须指定CRON表达式。

    定时触发器配置文件采用以下形式:

    /triggers/<triggers name>.json
    {
    "type": "SCHEDULED",
    "name": "<Trigger Name>",
    "function_name": "<Trigger Function Name>",
    "config": {
    "schedule": "<CRON expression>"
    },
    "disabled": <boolean>
    }
  4. 部署更改:

    运行以下命令以部署更改:

    appservices push

定时触发器具有以下配置选项:

字段
说明
Trigger Type
type: <string>
选择 Scheduled
Schedule Type
config.schedule: <string>

必填。您可以选择 Basic(基本)或 Advanced(高级)。Basic 计划根据您设置的时间间隔定期执行触发器,例如“每五分钟”或“每周一”。

高级计划根据您定义的自定义 CRON 表达式运行 Trigger。

Skip Events on Re-Enable
skip_catchup_event: <boolean>
默认禁用。如果启用,则在禁用此触发器期间发生的任何变更事件都将不会得到处理。
Event Type
function_name: <string>

Event Type部分中,您可以选择触发器触发时要执行的动作。您可以选择运行函数或使用AWS EventBridge。

定时触发器不会向其关联的函数传递任何参数。

Trigger Name
name: <string>
触发器名称。

CRON 表达式是用户定义的字符串,它们使用标准 cron 作业语法,用于定义计划触发器何时应执行。 Atlas根据 UTC 时间 执行 Trigger CRON 表达式 。只要 CRON表达式中的所有字段与当前日期和时间匹配, Atlas就会触发与表达式关联的触发器。

CRON 表达式是由五个空格分隔字段组成的字符串。每个字段都定义了执行其关联触发器的安排的一个精细部分:

* * * * *
│ │ │ │ └── weekday...........[0 (SUN) - 6 (SAT)]
│ │ │ └──── month.............[1 (JAN) - 12 (DEC)]
│ │ └────── dayOfMonth........[1 - 31]
│ └──────── hour..............[0 - 23]
└────────── minute............[0 - 59]
字段
Valid Values
说明
minute
[0 - 59]

表示一小时内的一分钟或多分钟。

如果 CRON 表达式的 minute 字段的值为 10,则该字段匹配整点后十分钟的任何时间(例如 9:10 AM)。

hour
[0 - 23]

采用 24 小时制,表示一天中的一个或多个小时。

如果 CRON 表达式 hour 字段的值为 15,则该字段匹配 3:00 PM3:59 PM 之间的任何时间。

dayOfMonth
[1 - 31]

表示一个月内的一天或多天。

如果 CRON 表达式的 dayOfMonth 字段的值为 3,则该字段匹配每月第三天的任何时间。

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)

表示一年内的一个月或多个月。

月份可以用数字(例如 2 代表二月)或三字母字符串(例如 APR 代表四月)表示。

如果 CRON 表达式 month 字段的值为 9,则该字段匹配九月中的任何时间。

weekday
0 (SUN)
1 (MON)
2 (TUE)
3 (WED)
4 (THU)
5 (FRI)
6 (SAT)

表示一周内的一天或多天。

工作日可以用数字表示(例如 2 代表星期二)或三个字母的字符串(例如 THU 为星期四)。

如果 CRON 表达式 weekday 字段的值为 3,则该字段匹配星期三的任何时间。

CRON 表达式中的每个字段都可以包含特定值或计算结果为一组值的表达式。下表描述了有效的字段值和表达式:

表达式类型
说明
All Values
(*)

匹配所有可能的字段值。

可用于所有表达式字段。

以下 CRON表达式安排触发器每天每分钟执行一次:

* * * * *
Specific Value
(<Value>)

匹配特定字段值。对于 weekdaymonth 之外的字段,该值始终为整数。weekdaymonth 字段可以是整数或三字母字符串(例如 TUEAUG)。

可用于所有表达式字段。

以下 CRON表达式安排触发器在每天的11 : 00 AM UTC 时间执行一次:

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

匹配包含两个或更多字段表达式或特定值的列表。

可用于所有表达式字段。

以下 CRON表达式安排触发器在一月、三月和七月每天的11 : 00 AM UTC 执行一次:

0 11 * 1,3,7 *
Range of Values
(<Start Value>-<End Value>)

匹配介于两个特定字段值之间(包含这两个特定值)的连续范围的字段值。

可用于所有表达式字段。

以下 CRON表达式安排触发器从 1 月1日到四月底每天的11 : 00 AM UTC 执行一次:

0 11 * 1-4 *
Modular Time Step
(<Field Expression>/<Step Value>)

匹配步长值整除字段值且无余数的任何时间(即 Value % Step == 0 时)。

minutehour 表达式字段中可用。

以下 CRON表达式安排触发器在每小时的第0 、 25和50分钟执行:

*/25 * * * *

在线商店希望每天生成前一天所有销售额的报告。它们将 store.orders 集合中的所有订单记录为类似于以下内容的文档:

{
_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") },
]
}
配置触发器的用户界面示例
trigger配置
{
"type": "SCHEDULED",
"name": "reportDailyOrders",
"function_name": "generateDailyReport",
"config": {
"schedule": "0 7 * * *"
},
"disabled": false
}

为了生成每日报告,存储创建了一个定时触发器,每天在 7:00 AM UTC 时触发。触发器触发后,会调用其链接的 Atlas Function generateDailyReport,该函数对 store.orders 集合运行聚合查询,生成报告。然后,此函数将聚合结果存储在 store.reports 集合中。

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

将 Query API与$match表达式结合使用,以减少函数查看的文档数量。这有助于提高函数性能并且不会达到函数内存限制。

另请参阅使用 $match表达式的定时触发器的示例部分。

后退

数据库触发器