Docs Menu
Docs Home
/
MongoDB Atlas
/ /

予定されたTriggers

項目一覧

  • 予定されたトリガーの作成
  • 構成
  • CRON 式
  • 式の構文
  • 形式
  • フィールド値
  • パフォーマンスの最適化

スケジュールされたトリガーを使用すると、 定義した定期的なスケジュールでサーバー側のロジックを実行できます。 スケジュールされたトリガーを使用して、毎分ごとのドキュメント更新、夜間レポートの生成、または毎週ごとのメールニュースレターの自動送信など、定期的に発生する作業を行うことができます。

新しいスケジュールされたtriggerは、 Atlas UIから、またはApp Services CLIを使用して作成できます。

  1. Triggersページに移動する

    1. まだ表示されていない場合は、プロジェクトを含む組織をナビゲーション バーの Organizations メニューで選択します。

    2. まだ表示されていない場合は、ナビゲーション バーの Projects メニューからプロジェクトを選択します。

    3. サイドバーで、 Services見出しの下のTriggersをクリックします。

      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 サブディレクトリに追加します。

    注意

    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>
    }
  4. 変更を配置します。

    次のコマンドを実行して、変更を配置します。

    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 を使用するユーザー定義の文字列 スケジュールされたトリガーがいつ実行されるかを定義するジョブ構文。 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 式のminuteフィールドの値が10の場合、フィールドは毎時10分後の任意の時間に一致します(例:9:10 AM)。

hour
[0 - 23]

24 時間制で 1 日のうちの 1 時間以上を表します。

CRON 式の hour フィールドの値が 15の場合、そのフィールドは 3:00 PM から 3:59 PMまでの任意の時間と一致します。

dayOfMonth
[1 - 31]

1 か月内の 1 日以上を表します。

CRON 式のdayOfMonthフィールドの値が3の場合、フィールドは毎月 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)

1 年のうちの 1 つ以上の月を表します。

月は数字(例:2 2 月)または 3 文字の文字列(例:4月は APR)で表すことができます。

CRON 式の month フィールドの値が 9 の場合、このフィールドは 9 月のいずれの時間にも一致します。

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

1 週間内の 1 日以上を表します。

曜日は、数字(例:火曜日の場合は 2)または 3 文字の文字列(例:木曜日の場合 THU)のどちらかで表すことができます。

CRON 式の weekday フィールドの値が 3 の場合、このフィールドは水曜日いずれの時間にも一致します。

CRON 式の各フィールドには、特定の値、または値の 1 セットとして評価される式を含めることができます。次の表では、有効なフィールド値と式について説明します。

式のタイプ
説明
All Values
(*)

あらゆるフィールド値と一致します。

すべての式フィールドで使用できます。

次の CRON 式は、トリガーを毎日 1 分ごとに実行するように設定します。

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

特定のフィールド値に一致します。weekday および month 以外のフィールドの場合、この値は常に整数になります。weekday または month フィールドは、整数または 3 文字の文字列(例: TUE または AUG)のどちらでも構いません。

すべての式フィールドで使用できます。

次の CRON式は、トリガーを毎日 11:00 にtriggerを実行するように設定します。

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

2 つ以上のフィールド式または特定の値のリストに一致します。

すべての式フィールドで使用できます。

以下の CRON式は、1 月、3 月、7 月の毎日 11:00 にtriggerを実行するように設定します。

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

2 つの特定のフィールド値の間にあり、かつそれらの値を含む、連続した範囲のフィールド値に一致します。

すべての式フィールドで使用できます。

以下の CRON式は、1 月 1 日から 4 月末までの毎日 11:00 にtriggerを実行するように設定します。

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

ステップ値がフィールド値を余りなしで均等に分割できる任意の時間(つまり Value % Step == 0 の場合)に一致します。

minute および hour 式フィールドで使用できます。

次の CRON式は、毎時 0 分、25 分、50 分にtriggerを実行するように設定します。

*/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 の例
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;
}

関数が調べるドキュメントの数を減らすには、 $match式と共に Query APIを使用します。 これにより関数のパフォーマンスが向上し、関数のメモリ制限 に達しなくなります。

$match式を使用する予定されたtriggerの例のセクション も参照してください。

戻る

データベース Triggers