予定されたTriggers
スケジュールされたトリガーを使用すると、 定義した定期的なスケジュールでサーバー側のロジックを実行できます。 スケジュールされたトリガーを使用して、毎分ごとのドキュメント更新、夜間レポートの生成、または毎週ごとのメールニュースレターの自動送信など、定期的に発生する作業を行うことができます。
予定されたトリガーの作成
新しいスケジュールされたtriggerは、 Atlas UIから、またはApp Services CLIを使用して作成できます。
Triggersページに移動する
まだ表示されていない場合は、プロジェクトを含む組織をナビゲーション バーの 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 を使用するユーザー定義の文字列 スケジュールされたトリガーがいつ実行されるかを定義するジョブ構文。 Atlas は UTC 時間 に基づいてTrigger CRON式を実行します 。 CRON式のすべてのフィールドが現在の日付と時刻と一致するたびに、Atlas は式に関連付けられているトリガーを起動します。
式の構文
形式
CRON 式は、スペースで区切られた 5 つのフィールドで構成される文字列です。各フィールドは、関連付けられたトリガーが実行されるスケジュールの詳細な部分を定義します。
* * * * * │ │ │ │ └── weekday...........[0 (SUN) - 6 (SAT)] │ │ │ └──── month.............[1 (JAN) - 12 (DEC)] │ │ └────── dayOfMonth........[1 - 31] │ └──────── hour..............[0 - 23] └────────── minute............[0 - 59]
フィールド | Valid Values | 説明 |
---|---|---|
minute | [0 - 59] | 1 時間以内の 1 分以上を表します。 CRON 式の |
hour | [0 - 23] | 24 時間制で 1 日のうちの 1 時間以上を表します。 CRON 式の |
dayOfMonth | [1 - 31] | 1 か月内の 1 日以上を表します。 CRON 式の |
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) | 1 年のうちの 1 つ以上の月を表します。 月は数字(例: CRON 式の |
weekday | 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を使用します。 これにより関数のパフォーマンスが向上し、関数のメモリ制限 に達しなくなります。