데이터베이스 트리거: CRUD 이벤트에 반응하기
학습자는 삽입 또는 업데이트 이벤트가 발생할 때 실행되는 데이터베이스 트리거를 만들고, 데이터를 동기화하거나 알림을 보내는 Atlas Function을 실행합니다.
데이터베이스 트리거: CRUD 이벤트에 반응하기은(는) CoddyKit의 무료 MongoDB Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 MongoDB Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. MongoDB Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.
What Are Atlas Database Triggers?
Atlas Database Triggers are serverless event handlers that automatically execute an Atlas Function whenever a specific CRUD event (insert, update, replace, delete) occurs on a collection. They are built on top of MongoDB Change Streams and eliminate the need to run a polling process or manage infrastructure for event-driven workflows.
How Triggers Work Under the Hood
Internally, Atlas triggers use a change stream that MongoDB opens on the target collection. Every matching change event is forwarded to the trigger, which invokes the associated Atlas Function with the event document as its argument. The function runs in Atlas's managed JavaScript runtime — no servers to provision or scale. Triggers can handle up to hundreds of events per second with auto-scaling.
Creating a Trigger: Key Configuration
When configuring a database trigger you specify: Cluster name and collection to watch. Operation types to react to: insert, update, replace, delete, or any combination. Full Document option — when enabled, MongoDB fetches the complete document after the change and includes it in the event payload. Linked Function — the Atlas Function to invoke.
// Trigger configuration (set in Atlas UI or App Services API)
// {
// name: 'onOrderInsert',
// type: 'DATABASE',
// config: {
// serviceId: '...',
// database: 'mydb',
// collection: 'orders',
// operationTypes: ['INSERT'],
// fullDocument: true
// },
// functionName: 'handleNewOrder'
// }The Change Event Document
The event document passed to the trigger function has these key fields: operationType ('insert', 'update', 'replace', 'delete'), fullDocument (the document after the change, if enabled), documentKey (the _id of the changed document), updateDescription (for updates: which fields were set or unset), and ns (database and collection namespace).
// Example change event passed to the trigger function:
// {
// operationType: 'INSERT',
// fullDocument: { _id: ObjectId('...'), item: 'laptop', qty: 1, status: 'pending' },
// documentKey: { _id: ObjectId('...') },
// ns: { db: 'mydb', coll: 'orders' },
// clusterTime: Timestamp(...)
// }Writing a Trigger Function: New Order Handler
A trigger function is an Atlas Function — server-side JavaScript that has access to the context object (MongoDB client, services, user info) and receives the change event as its first argument. Here is a pattern for handling new orders: send a notification email and update an analytics counter.
// Atlas Function: handleNewOrder
exports = async function(changeEvent) {
const order = changeEvent.fullDocument
if (!order) return // safeguard if fullDocument is null
const db = context.services.get('mongodb-atlas').db('mydb')
// Update daily order count
await db.collection('daily_stats').updateOne(
{ date: new Date().toISOString().split('T')[0] },
{ $inc: { orderCount: 1, revenue: order.amount || 0 } },
{ upsert: true }
)
// Send notification (using a linked email service)
await context.services.get('myEmailService').send({
to: 'ops@company.com',
subject: 'New order: ' + order._id,
body: 'Amount: ' + order.amount
})
}Filtering Trigger Events
You can add a match expression to a trigger so it only fires for a subset of events. This is implemented as an aggregation pipeline on the change stream. For example, only trigger on orders above a certain amount, only fire on updates where the status field changed, or only react to documents from a specific tenant.
// Trigger match filter (aggregation pipeline on the change stream)
// Only fire the trigger when order amount > 500
// {
// 'match': {
// 'fullDocument.amount': { '$gt': 500 },
// 'operationType': 'INSERT'
// }
// }
// Only fire when 'status' field is part of the update
// {
// 'match': {
// 'updateDescription.updatedFields.status': { '$exists': true }
// }
// }Full Document vs Update Lookup
For INSERT and REPLACE operations, fullDocument is always available in the change event. For UPDATE events, fullDocument is only available if you enable the Full Document option in the trigger config, which causes Atlas to perform an additional document lookup (a second read). Without it, only updateDescription (changed fields) is available.
// Trigger function handling UPDATE events
exports = async function(changeEvent) {
const { operationType, updateDescription, fullDocument, documentKey } = changeEvent
if (operationType === 'UPDATE') {
const updatedFields = updateDescription.updatedFields
// Only process if 'status' was updated to 'shipped'
if (updatedFields.status === 'shipped') {
// Notify customer using documentKey._id to fetch full data
const db = context.services.get('mongodb-atlas').db('mydb')
const order = fullDocument || await db.collection('orders').findOne({ _id: documentKey._id })
// ... send shipment notification
}
}
}Error Handling and Retry in Triggers
If a trigger function throws an error or times out (maximum 90 seconds), Atlas automatically retries it up to 3 times with exponential backoff. After all retries fail, the event is logged as failed in the Atlas Trigger error log. You should write trigger functions to be idempotent — applying the function multiple times to the same event produces the same result — to handle retries safely.
// Idempotent trigger: use upsert to avoid duplicate stats on retry
exports = async function(changeEvent) {
const order = changeEvent.fullDocument
const db = context.services.get('mongodb-atlas').db('mydb')
// Upsert is safe to retry: same result whether run once or five times
await db.collection('order_summaries').updateOne(
{ _id: order._id }, // dedup key = original document _id
{ $set: { status: order.status, amount: order.amount, processedAt: new Date() } },
{ upsert: true }
)
}Cascading Triggers: Data Sync Pattern
A common use case is data synchronisation: when a document changes in one collection, a trigger propagates the change to a denormalised copy in another collection. For example, when a user's email changes in the users collection, a trigger updates the denormalised email field in every document in the orders collection that references that user.
// Sync user email to orders whenever user is updated
exports = async function(changeEvent) {
const updated = changeEvent.updateDescription.updatedFields
if (!updated.email) return // email didn't change, skip
const userId = changeEvent.documentKey._id
const db = context.services.get('mongodb-atlas').db('mydb')
await db.collection('orders').updateMany(
{ userId: userId },
{ $set: { userEmail: updated.email } }
)
}Trigger Ordering and Concurrency
By default, Atlas triggers process events sequentially in the order they arrive. If you enable event ordering off (in trigger settings), multiple function invocations can run in parallel for higher throughput — but then your function must be safe for concurrent execution. Sequential mode is safer; parallel mode is faster for high-event-rate collections.
Disabling and Monitoring Triggers
You can enable or disable triggers at any time from the Atlas UI without deleting them. The Trigger Execution Log in Atlas shows each invocation: status (success/failure/timeout), duration, and error details. Use this log to debug failing triggers and monitor execution trends. Atlas also exposes trigger metrics in the Atlas Monitoring dashboard.
Quick Check
Test your understanding of MongoDB & NoSQL Databases concepts from this lesson.
Lesson Recap
In this lesson you learned: Atlas Database Triggers fire an Atlas Function on insert/update/replace/delete events using a change stream internally, match expressions filter which events invoke the function, and functions must be idempotent because Atlas retries failed invocations automatically. Next up we explore scheduled triggers and cron jobs.
AI 튜터와 함께 JavaScript을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 30
- 레슨
- 120
자주 묻는 질문
“데이터베이스 트리거: CRUD 이벤트에 반응하기” 강의는 무료인가요?
네 — “데이터베이스 트리거: CRUD 이벤트에 반응하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 MongoDB Academy 강의 전체를 잠금 해제할 수 있습니다. MongoDB Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“데이터베이스 트리거: CRUD 이벤트에 반응하기”에서 뭘 배우나요?
학습자는 삽입 또는 업데이트 이벤트가 발생할 때 실행되는 데이터베이스 트리거를 만들고, 데이터를 동기화하거나 알림을 보내는 Atlas Function을 실행합니다. 브라우저에서 직접 실행하는 실습 코드로 MongoDB Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
MongoDB Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 MongoDB Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“데이터베이스 트리거: CRUD 이벤트에 반응하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 MongoDB Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 MongoDB Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 데이터베이스 트리거: CRUD 이벤트에 반응하기
- 예약된 트리거와 Cron 작업
- JavaScript로 Atlas Functions 작성하기
- 경량 웹훅으로서의 HTTPS 엔드포인트