予定されたTriggers
スケジュールされたトリガーを使用すると、 定義した定期的なスケジュールでサーバー側のロジックを実行できます。 スケジュールされたトリガーを使用して、毎分ごとのドキュメント更新、夜間レポートの生成、または毎週ごとのメールニュースレターの自動送信など、定期的に発生する作業を行うことができます。
予定されたトリガーの作成
新しいスケジュールされたtriggerは、 Atlas UIから、またはApp Services CLIを使用して作成できます。
Triggersページに移動する
警告
ナビゲーションの改善が進行中
現在、新しく改善されたナビゲーション エクスペリエンスを展開しています。次の手順が Atlas UIのビューと一致しない場合は、プレビュー ドキュメントを参照してください。
まだ表示されていない場合は、プロジェクトを含む組織をナビゲーション バーの Organizations メニューで選択します。
まだ表示されていない場合は、ナビゲーション バーの Projects メニューからプロジェクトを選択します。
サイドバーで、 Services見出しの下のTriggersをクリックします。
Triggersページが表示されます。
Add Triggerをクリックしてトリガー設定ページを開きます。
Scheduled trigger の種類を選択します。
trigger を設定し、 [ Save ] をクリックします。

MongoDB Atlasユーザーを認証します。
MongoDB Atlas Administration APIキーを使用して、App Services CLI にログします。
appservices login --api-key="<API KEY>" --private-api-key="<PRIVATE KEY>" アプリの最新の構成ファイルを取得します。
次のコマンドを実行して、構成ファイルのローカルコピーを取得します。
appservices pull --remote=<App ID> デフォルトでは 、コマンドは現在の 作業ディレクトリにファイルをプルします。 任意の
--local
フラグを使用してディレクトリパスを指定できます。予定されたtriggerの構成ファイルを、 ローカルアプリケーションディレクトリの
triggers
サブディレクトリに追加します。注意
triggerBasicを使用して、 スケジュールで実行される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> } 変更を配置します。
次のコマンドを実行して、変更を配置します。
appservices push
構成
スケジュールされた Triggers には、次の構成オプションがあります。
フィールド | 説明 |
---|---|
Trigger Type type: <string> | Scheduled を選択します。 |
Schedule Type config.schedule: <string> | 必須。[ Basic ] または [ Advanced ] を選択できます。基本スケジュールでは、設定した間隔に基づいてトリガーが定期的に実行されます。たとえば、「5 分ごと」、「毎週月曜日」などです。 高度なスケジュールでは、定義したカスタム CRON式に基づいてトリガーが実行されます。 |
Skip Events on Re-Enable skip_catchup_event: <boolean> | デフォルトで無効です。有効にすると、この trigger が無効になっている間に発生した変更イベントは処理されません。 |
Event Type function_name: <string> | Event Type セクションで、trigger が起動したときに実行されるアクションを選択します。関数を実行するか、 AWS EventBridge を使用するかを選択できます。 予定されたトリガーは、リンク先の関数に引数を渡しません。 |
Trigger Name name: <string> | triggerの名前。 |
CRON 式
CRON 式は標準の cron を使用するユーザー定義の文字列です スケジュールされたtrigger をいつ実行するかを定義するためのジョブ構文。Atlasはtrigger UTC 時間 に基づいて CRON 式を実行します 。CRON式のすべてのフィールドが現在の日付と時刻と一致するたびに、 Atlasは式に関連付けられているtriggerを起動します。
式の構文
形式
CRON 式は、スペースで区切られた 5 つのフィールドで構成される文字列です。各フィールドは、関連付けられたトリガーが実行されるスケジュールの詳細な部分を定義します。
* * * * * │ │ │ │ └── weekday...........[0 (SUN) - 6 (SAT)] │ │ │ └──── month.............[1 (JAN) - 12 (DEC)] │ │ └────── dayOfMonth........[1 - 31] │ └──────── hour..............[0 - 23] └────────── minute............[0 - 59]
フィールド | Valid Values | 説明 |
---|---|---|
| [0 - 59] | 1 時間以内の 1 分以上を表します。 CRON 式の |
| [0 - 23] | 24 時間制で 1 日のうちの 1 時間以上を表します。 CRON 式の |
| [1 - 31] | 1 か月内の 1 日以上を表します。 CRON 式の |
| 1 (JAN) 7 (JUL) 2 (FEB) 8 (AUG) 3 (MAR) 9 (SEP) 4 (APR) 10 (OCT) 5 (MAY) 11 (NOV) 6 (JUN) 12 (DEC) | 1 年のうちの 1 つ以上の月を表します。 月は数字(例: CRON 式の |
| 0 (SUN) 1 (MON) 2 (TUE) 3 (WED) 4 (THU) 5 (FRI) 6 (SAT) | 1 週間内の 1 日以上を表します。 曜日は、数字(例:火曜日の場合は CRON 式の |
フィールド値
CRON 式の各フィールドには、特定の値、または値の 1 セットとして評価される式を含めることができます。次の表では、有効なフィールド値と式について説明します。
式のタイプ | 説明 | |
---|---|---|
All Values (*) | あらゆるフィールド値と一致します。 すべての式フィールドで使用できます。 次の CRON 式は、トリガーを毎日 1 分ごとに実行するように設定します。
| |
Specific Value (<Value>) | 特定のフィールド値に一致します。 すべての式フィールドで使用できます。 次の CRON式は、トリガーを毎日 11:00 にtriggerを実行するように設定します。
| |
List of Values (<Expression1>,<Expression2>,...) | 2 つ以上のフィールド式または特定の値のリストに一致します。 すべての式フィールドで使用できます。 以下の CRON式は、1 月、3 月、7 月の毎日 11:00 にtriggerを実行するように設定します。
| |
Range of Values (<Start Value>-<End Value>) | 2 つの特定のフィールド値の間にあり、かつそれらの値を含む、連続した範囲のフィールド値に一致します。 すべての式フィールドで使用できます。 以下の CRON式は、1 月 1 日から 4 月末までの毎日 11:00 にtriggerを実行するように設定します。
| |
Modular Time Step (<Field Expression>/<Step Value>) | ステップ値がフィールド値を余りなしで均等に分割できる任意の時間(つまり
次の CRON式は、毎時 0 分、25 分、50 分にtriggerを実行するように設定します。
|
例
あるオンラインショップが、前日の全売上の日次レポートを作成したいと考えています。彼らはすべての注文を 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") }, ] }

{ "type": "SCHEDULED", "name": "reportDailyOrders", "function_name": "generateDailyReport", "config": { "schedule": "0 7 * * *" }, "disabled": false }
日次レポートを生成するために、このショップは毎日 7:00 AM UTC
に発動するように予定されたトリガーを作成します。このトリガーが発動すると、これにリンクされた Atlas Function generateDailyReport
が呼び出され、 store.orders
コレクションに対して集計クエリが実行され、レポートが生成されます。そして、その関数は集計の結果を store.reports
コレクションに格納します。
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; }
パフォーマンスの最適化
関数が調べるドキュメントの数を減らすには、 $match式と共に Query APIを使用します。 これにより関数のパフォーマンスが向上し、関数のメモリ制限 に達しなくなります。