Docs 菜单
Docs 主页
/
MongoDB Atlas
/ /

定时触发器

在此页面上

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

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

您可以从trigger Atlas用户界面或使用 创建新的计划App Services CLI 。

  1. 导航至 Triggers页面

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

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

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

      会显示触发器页面。

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

  3. 选择 Scheduled trigger类型。

  4. 配置trigger ,然后单击 Save

配置触发器的示例 UI
  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. 将定时trigger配置文件添加到本地应用程序目录的 triggers 子目录中。

    注意

    您无法使用trigger Basic创建按 安排运行的App Services CLI 。所有导入的定时trigger配置都必须指定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表达式运行触发器。

Skip Events on Re-Enable
skip_catchup_event: <boolean>

默认禁用。如果启用,则不会处理在禁用此触发器时发生的任何变更事件。

Event Type
function_name: <string>

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

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

Trigger Name
name: <string>

触发器名称。

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

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表达式安排trigger在世界标准时间 (UTC) 每天的 11:00 上午执行一次:

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

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

可用于所有表达式字段。

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

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

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

可用于所有表达式字段。

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

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

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

minutehour 表达式字段中可用。

以下 CRON表达式安排trigger在每小时的第 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") },
]
}
配置触发器的示例 UI
触发器配置
{
"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表达式的定时trigger的示例部分。

后退

数据库触发器