Docs Menu
Docs Home
/
MongoDB Atlas
/ /

데이터베이스 트리거

이 페이지의 내용

  • 데이터베이스 트리거 생성
  • 구성
  • 변경 이벤트 유형
  • 데이터베이스 트리거 예시
  • 일시 중단된 트리거
  • 트리거 시간 보고
  • 성능 최적화

데이터베이스 트리거를 사용하면 연결된 MongoDB Atlas cluster 에서 데이터베이스 변경이 발생할 때마다 서버 측 로직을 실행할 수 있습니다. 개별 컬렉션, 전체 데이터베이스 및 전체 클러스터 에서 트리거를 구성할 수 있습니다.

데이터베이스 서버 에서 실행 되는 SQL 데이터 트리거와 달리, Atlas 데이터베이스 트리거는 데이터베이스 서버 와 독립적으로 확장되는 서버리스 컴퓨팅 계층에서 실행 됩니다. 트리거는 자동으로 Atlas 함수 를 호출하고 AWS EventBridge를 통해 외부 핸들러에 이벤트를 전달할 수 있습니다.

데이터베이스 트리거를 사용하여 이벤트 기반 데이터 상호 작용을 구현 합니다. 예를 예시 관련 문서 가 변경될 때 한 문서 의 정보를 자동으로 업데이트 하거나 새 문서 가 삽입될 때마다 외부 서비스에 요청 을 보낼 수 있습니다.

데이터베이스 트리거는 MongoDB 변경 스트림 을 사용하여 컬렉션 의 실시간 변경 사항을 감시합니다. 변경 스트림 은 컬렉션 의 문서 에 대한 작업을 각각 설명하는 일련의 데이터베이스 이벤트 입니다. 앱 은 트리거가 활성화된 상태에서 각 컬렉션 에 대해 단일 변경 스트림 을 엽니다. 컬렉션 에 대해 트리거가 여러 개 활성화된 경우 해당 트리거는 모두 동일한 변경 스트림 을 주식 합니다.

중요

Change Stream 제한

cluster 에서 열 수 있는 총 변경 스트림 수에는 클러스터 크기에 따라 제한이 있습니다. 자세한 내용은 변경 스트림 제한 사항을 참조하세요.

또한 서버리스 인스턴스 또는 연합 데이터베이스 인스턴스 는 변경 스트림을 지원 하지 않으므로 데이터베이스 트리거를 정의할 수 없습니다.

트리거가 실행되도록 하는 작업과 트리거가 실행되면 어떤 일이 발생하는지 제어할 수 있습니다. 예를 예시 문서 의 특정 필드 가 업데이트될 때마다 함수를 실행 수 있습니다. 함수는 전체 변경 이벤트 에 액세스 할 수 있으므로 항상 변경된 내용을 파악할 수 있습니다. 변경 이벤트 를 AWS EventBridge 로 전달하여 Atlas 외부에서 이벤트 를 처리하다 할 수도 있습니다.

트리거는 변경 이벤트를 필터링하는 $match 표현식과 각 이벤트에 포함되는 데이터를 제한하는 $project 표현식을 지원합니다.

경고

배포서버 및 데이터베이스 수준 트리거에서는 다른 트리거가 실행되어 재귀가 발생하는 방식으로 트리거를 구성할 수 있습니다. 예제에는 동일한 데이터베이스 내의 컬렉션 에 기록하는 데이터베이스 수준 트리거, 동일한 클러스터 의 다른 데이터베이스 에 로그를 기록하는 클러스터 수준 로거 또는 로그 전달자가 포함됩니다.

Atlas UI 또는 App Services CLI 를 사용하여 데이터베이스 트리거를 만들 수 있습니다.

  1. Triggers 페이지로 이동

    1. 아직 표시되지 않은 경우 탐색 표시줄의 Organizations 메뉴에서 프로젝트가 포함된 조직을 선택합니다.

    2. 아직 표시되지 않은 경우 내비게이션 바의 Projects 메뉴에서 프로젝트를 선택합니다.

    3. 사이드바에서 Services 제목 아래의 Triggers 을 클릭합니다.

      트리거 페이지가 표시됩니다.

  2. Add Trigger을 클릭하여 트리거 구성 페이지를 엽니다.

  3. Database 트리거 유형을 선택합니다.

  4. 트리거를 구성한 다음 Save 을(를) 클릭합니다.

/images/trigger-example-db.png
  1. MongoDB Atlas 사용자를 인증합니다.

    MongoDB Atlas 관리 API 키 를 사용하여 App Services CLI 에 로그인 합니다.

    appservices login --api-key="<API KEY>" --private-api-key="<PRIVATE KEY>"
  2. 앱의 최신 구성 파일을 가져옵니다.

    다음 명령을 실행하여 구성 파일의 로컬 복사본을 가져옵니다.

    appservices pull --remote=<App ID>

    기본값 으로 이 명령은 파일을 현재 작업 디렉토리 로 가져옵니다. 선택 사항인 --local 플래그를 사용하여 디렉토리 경로를 지정할 수 있습니다.

  3. 로컬 앱 파일의 triggers 하위 디렉토리에 데이터베이스 트리거 구성 파일 을 추가합니다.

  4. 변경 사항을 배포합니다:

    다음 명령을 실행하여 변경 사항을 배포 합니다.

    appservices push

참고

Atlas 는 트리거 구성 파일에 특정 파일 이름을 시행하다 하지 않습니다. 그러나 일단 가져오면 Atlas 는 정의된 트리거의 이름과 일치하도록 각 구성 파일 의 이름을 바꿉니다.

데이터베이스 트리거에는 다음과 같은 구성 옵션이 있습니다.

Trigger Details 섹션 내에서 원하는 세분성 수준에 따라 Watch Against 트리거할 범위를 선택할 수 있습니다. 선택할 수 있는 옵션은 다음과 같습니다.

  • Collection지정된 컬렉션에 변경 사항이 발생하는 경우

  • Database지정된 데이터베이스의 어떤 컬렉션에서든 변화가

  • Deployment지정된 클러스터 에서 배포서버 변경이 발생하는 경우.

    배포 소스 유형을 선택하면 다음 데이터베이스에서 변경 내용이 감시되지 않습니다 .

    • 관리 데이터베이스 admin, local, config

    • 동기화 데이터베이스 __realm_sync__realm_sync_<app_id>

    중요

    배포 수준 소스 유형은 전용 계층에서만 사용할 수 있습니다.

사용 중인 소스 유형에 따라 추가 옵션이 달라집니다. 다음 표에서 옵션에 대한 설명을 살펴보세요.

소스 유형
옵션
Collection

  • Cluster Name트리거가 연결된 MongoDB cluster의 이름입니다.

  • Database Name조회한 컬렉션이 포함된 MongoDB 데이터베이스입니다.

  • Collection Name. 관찰할 MongoDB 컬렉션입니다. 선택 사항. 이 옵션을 비워두면 소스 유형이 '데이터베이스'로 변경됩니다.

  • Operation Type. 트리거가 실행되도록 하는 작업 유형 입니다. 트리거가 응답할 작업 유형을 선택합니다. 옵션에는 다음이 포함됩니다.

    • Insert

    • Update

    • 바꾸기

    • 삭제

    참고: MongoDB Compass 또는 MongoDB Atlas 데이터 탐색기 에서 실행한 업데이트 작업은 이전 문서 를 완전히 대체합니다. 결과적으로 이러한 클라이언트의 업데이트 작업은 Update 이벤트가 아닌 Replace 변경 이벤트를 생성합니다.

  • Full Document. 활성화된 경우Update 변경 이벤트에는 필드 변경 사항이 적용된 후 수정된 문서 의 최신 과반수 커밋 fullDocument 버전이 포함됩니다.

    참고: 이 설정과 관계없이 삽입바꾸기 이벤트에는 항상 fullDocument 필드 가 포함됩니다. 삭제 이벤트에는 fullDocument 필드 가 포함되지 않습니다.

  • Document Preimage. 활성화되면 변경 이벤트에는 fullDocumentBeforeChange 필드 에 변경 사항이 적용 되기 직전에 수정된 문서 사본이 포함됩니다. 여기에는 성능 고려 사항 이 있습니다. Insert 이벤트를 제외한 모든 변경 이벤트에는 문서 사전 이미지가 포함됩니다.

Database

  • Cluster Name트리거가 연결된 MongoDB cluster의 이름입니다.

  • Database Name. 관찰할 MongoDB database 입니다. 선택 사항. 이 옵션을 비워 두면 공유 계층 이 아닌 경우 소스 유형이 Deployment 로 변경되며, 이 경우 Atlas 에서 트리거를 저장할 수 없습니다.

  • Operation Type. 트리거가 실행되도록 하는 작업 유형 입니다. 트리거가 응답할 작업 유형을 선택합니다. 옵션에는 다음이 포함됩니다.

    • 컬렉션 생성

    • 컬렉션 수정

    • 컬렉션 이름 변경

    • 드롭 collection

    • 샤드 컬렉션

    • 컬렉션 리샤딩

    • collection 샤드 키 세분화

    참고: MongoDB Compass 또는 MongoDB Atlas 데이터 탐색기 에서 실행한 업데이트 작업은 이전 문서 를 완전히 대체합니다. 결과적으로 이러한 클라이언트의 업데이트 작업은 Update 이벤트가 아닌 Replace 변경 이벤트를 생성합니다.

  • Full Document. 활성화된 경우Update 변경 이벤트에는 필드 변경 사항이 적용된 후 수정된 문서 의 최신 과반수 커밋 fullDocument 버전이 포함됩니다.

    참고: 이 설정과 관계없이 삽입바꾸기 이벤트에는 항상 fullDocument 필드 가 포함됩니다. 삭제 이벤트에는 fullDocument 필드 가 포함되지 않습니다.

  • Document Preimage. 활성화되면 변경 이벤트에는 fullDocumentBeforeChange 필드 에 변경 사항이 적용 되기 직전에 수정된 문서 사본이 포함됩니다. 여기에는 성능 고려 사항 이 있습니다. Insert 이벤트를 제외한 모든 변경 이벤트에는 문서 사전 이미지가 포함됩니다. 데이터베이스 및 배포 소스에 대해 비활성화하여 생성 중인 새 컬렉션 에 대한 클러스터 의 불필요한 감시를 제한합니다.

Deployment

  • Cluster Name트리거가 연결된 MongoDB cluster의 이름입니다.

  • Operation Type. 트리거가 실행되도록 하는 클러스터 에서 발생하는 작업 유형 입니다. 트리거가 응답할 작업 유형을 선택합니다. 옵션에는 다음이 포함됩니다.

    • 데이터베이스 삭제

  • Full Document. 활성화된 경우Update 변경 이벤트에는 필드 변경 사항이 적용된 후 수정된 문서 의 최신 과반수 커밋 fullDocument 버전이 포함됩니다.

    참고: 이 설정과 관계없이 삽입바꾸기 이벤트에는 항상 fullDocument 필드 가 포함됩니다. 삭제 이벤트에는 fullDocument 필드 가 포함되지 않습니다.

  • Document Preimage. 활성화되면 변경 이벤트에는 fullDocumentBeforeChange 필드 에 변경 사항이 적용 되기 직전에 수정된 문서 사본이 포함됩니다. 여기에는 성능 고려 사항 이 있습니다. Insert 이벤트를 제외한 모든 변경 이벤트에는 문서 사전 이미지가 포함됩니다. 데이터베이스 및 배포 소스에 대해 비활성화하여 생성 중인 새 컬렉션 에 대한 클러스터 의 불필요한 감시를 제한합니다.

사전 이미지 및 성능 최적화

사전 이미지에는 추가 스토리지 오버헤드가 필요하며 이는 성능에 영향을 줄 수 있습니다. 컬렉션에서 사전 이미지를 사용하지 않는 경우 사전 이미지를 비활성화해야 합니다. 자세한 내용은 컬렉션 수준 사전 이미지 비활성화를 참조하세요.

문서 사전 이미지는 MongoDB 4.4 이상을 실행하는 비샤드형 Atlas cluster와 MongoDB 5.3 이상을 실행하는 샤드형 Atlas cluster에서 지원됩니다. 클러스터가 5.3 이상을 실행하는 한 비샤드형 클러스터(사전 이미지 포함)를 샤드형 클러스터로 업그레이드할 수 있습니다.

필드
설명
Auto-Resume

활성화된 경우, 이 트리거의 재개 토큰을 클러스터의 oplog 에서 찾을 수 없는 경우 트리거는 다음번 관련 변경 스트림 이벤트 에서 자동으로 이벤트 처리 를 재개합니다. 트리거가 일시 중단된 시점부터 트리거가 실행을 재개할 때까지의 모든 변경 스트림 이벤트에는 트리거가 실행되지 않습니다.

Event Ordering

활성화하면 트리거 이벤트가 발생한 순서대로 처리됩니다. 비활성화하면 이벤트를 병렬로 처리할 수 있으므로 동시에 많은 이벤트가 발생할 때 속도가 더 빨라집니다.

이벤트 순서 지정이 활성화되면 변경 이벤트의 타임스탬프를 기준으로 이 트리거가 순차적으로 여러 번 실행됩니다. 이벤트 순서 지정이 비활성화되면 이 트리거가 순서에 관계없이 여러 번 실행됩니다.

팁: 대량 데이터베이스 작업에 응답하는 트리거의 성능을 개선하려면 이벤트 순서를 비활성화하세요.

Skip Events On Re-Enable
기본값 비활성화되어 있습니다. 활성화하면 이 트리거가 비활성화된 동안 발생한 변경 이벤트가 처리되지 않습니다.

Event Type 섹션에서 트리거가 실행될 때 수행할 조치 를 선택합니다. 함수 를 실행 하거나 AWS EventBridge를 사용하도록 선택할 수 있습니다.

Advanced 섹션에서 다음과 같은 선택적 구성 옵션을 사용할 수 있습니다.

필드
설명
Project Expression

변경 스트림의 각 이벤트에서 필드의 하위 집합을 선택하는 $project 표현식입니다. 이 표현식을 사용해 트리거의 실행을 최적화할 수 있습니다.

표현식은 변경 이벤트의 필드 이름을 필드를 제외한 0 또는 필드를 포함하는 1 중 하나에 매핑하는 객체입니다. 표현식은 0 또는 1 중 하나의 값을 가질 수 있지만 두 값을 함께 가질 수는 없습니다. 이렇게 하면 프로젝션이 포괄적 프로젝션과 배타적 프로젝션의 두 가지 카테고리로 분할됩니다.

  • 포괄적 프로젝트 표현식은 각 변경 이벤트 문서에 포함할 필드를 지정합니다. 표현식은 포함할 필드의 이름을 1에 매핑하는 객체입니다. 필드를 포함하지 않으면 예상 변경 이벤트에 포함되지 않습니다.

    다음 프로젝션에는 _idfullDocument 필드만 포함됩니다.

    {
    _id: 1,
    fullDocument: 1
    }
  • 배타적 프로젝트 표현식은 각 변경 이벤트 문서에서 제외할 필드를 지정합니다. 이 표현식은 포함할 필드 이름을 0에 매핑하는 객체입니다. 필드를 제외하지 않으면 해당 필드는 예상 변경 이벤트에 포함됩니다.

    다음 프로젝션에서는 _idfullDocument 필드가 제외됩니다.

    {
    _id: 0,
    fullDocument: 0
    }

    프로젝션이 있는 operation_type 필드를 제외할 수 없습니다. 이렇게 하면 트리거가 특정 이벤트의 작업 유형에 대해 실행되어야 하는지 항상 확인할 수 있습니다.

Match Expression

Atlas 가 트리거를 실행하게 하는 변경 이벤트를 필터하다 하는 데 사용하는 $match 표현식 문서 입니다. 트리거는 이 일치 표현식 에 대해 수신한 모든 변경 이벤트 객체를 평가하며, 지정된 변경 이벤트 에 대해 표현식 이 true 로 평가되는 경우에만 실행됩니다.

MongoDB는 일치 표현식에 내장된 문서에 대해 완전한 동등성 매치를 수행합니다. 내장된 문서에서 특정 필드를 일치시키려면 점 표기법을 사용해 해당 필드를 직접 참조해야 합니다. 자세한 내용은 MongoDB 서버 매뉴얼의 내장된 문서에 대한 쿼리를 참조하세요.

성능을 최적화하려면 $match 표현식 을 사용하여 트리거가 처리하는 필드 수를 제한합니다. 자세히 보기.

Maximum Throughput

연결된 데이터 소스가 전용 서버(M10+ 계층)인 경우 최대 처리량을 기본 동시 프로세스 10,000개 이상으로 늘릴 수 있습니다.

중요: 최대 처리량 을 활성화 하려면 이벤트 순서 지정을 비활성화해야 합니다.

최대 처리량 을 늘리기 전에 하나 이상의 트리거가 속도 제한이 있는 외부 API 를 호출하고 있는지 고려하세요. 트리거 속도를 높이면 해당 제한을 초과할 수 있습니다.

처리량을 늘리면 워크로드도 더 커져 전체 클러스터 성능에 영향을 줄 수 있습니다.

데이터베이스 변경 이벤트는 연결된 MongoDB Atlas cluster의 특정 컬렉션에 대한 개별 변경 사항을 나타냅니다.

모든 데이터베이스 이벤트는 기본 변경 스트림에서 방출된 변경 이벤트 객체와 동일한 작업 유형 및 구조를 갖습니다. 변경 이벤트에는 다음과 같은 작업 유형이 있습니다.

작업 유형
설명
문서 삽입 (모든 트리거 유형)
컬렉션에 추가된 새 문서를 나타냅니다.
문서 업데이트 (모든 트리거 유형)
컬렉션의 기존 문서에 대한 변경 사항을 나타냅니다.
문서 삭제 (모든 트리거 유형)
컬렉션에서 삭제된 문서를 나타냅니다.
문서 교체 (모든 트리거 유형)
컬렉션의 문서를 대체한 새 문서를 나타냅니다.
컬렉션 만들기 (데이터베이스 및 배포 트리거 유형에만 해당)
새 컬렉션 생성을 나타냅니다.
컬렉션 수정 (데이터베이스 및 배포 트리거 유형에만 해당)
수정 컬렉션을 나타냅니다.
컬렉션 이름 변경 (데이터베이스 및 배포 트리거 유형에만 해당)
컬렉션 이름이 변경되는 것을 나타냅니다.
컬렉션 삭제 (데이터베이스 및 배포 트리거 유형에만 해당)
삭제되는 컬렉션을 나타냅니다.
샤드 컬렉션 (데이터베이스 및 배포 트리거 유형에만 해당)
컬렉션이 비샤드형에서 샤드형으로 변경되는 것을 나타냅니다.
컬렉션 리샤드 (데이터베이스 및 배포 트리거 유형에만 해당)
컬렉션의 샤딩에 대한 변경을 나타냅니다.
컬렉션 샤드 키 구체화 (데이터베이스 및 배포 트리거 유형에만 해당)
컬렉션의 샤드 키 변경을 나타냅니다.
인덱스 만들기 (데이터베이스 및 배포 트리거 유형에만 해당)
새 인덱스 생성을 나타냅니다.
인덱스 삭제 (데이터베이스 및 배포 트리거 유형에만 해당)
삭제되는 인덱스를 나타냅니다.
데이터베이스 삭제 (배포 트리거 유형에만 해당)
삭제되는 데이터베이스를 나타냅니다.

데이터베이스 변경 이벤트 객체의 일반적인 형태는 다음과 같습니다.

{
_id : <ObjectId>,
"operationType": <string>,
"fullDocument": <document>,
"fullDocumentBeforeChange": <document>,
"ns": {
"db" : <string>,
"coll" : <string>
},
"documentKey": {
"_id": <ObjectId>
},
"updateDescription": <document>,
"clusterTime": <Timestamp>
}

온라인 스토어에서 고객이 주문하는 위치가 변경될 때마다 이를 고객에게 알리려고 합니다. 이 스토어는 각 주문을 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: NumberDecimal("10.99") }
],
shippingLocation: [
{ location: "Memphis", time: ISODate("2018-06-27T18:22:33.243Z") },
]
}

이 프로세스 를 자동화하기 위해 저장 는 store.orders 컬렉션 에서 Update 변경 이벤트를 수신하는 데이터베이스 트리거를 만듭니다. 트리거가 Update 이벤트 를 관찰하면 변경 이벤트 객체 를 연결된 함수인 textShippingUpdate 에 전달합니다. 함수는 shippingLocation 필드 에 대한 변경 사항이 있는지 변경 이벤트 를 확인하고, 업데이트된 경우 주문의 새 위치 가 포함된 문자 메시지를 고객에게 보냅니다.

트리거를 구성하는 UI 예시
트리거 구성
{
"type": "DATABASE",
"name": "shippingLocationUpdater",
"function_name": "textShippingUpdate",
"config": {
"service_name": "mongodb-atlas",
"database": "store",
"collection": "orders",
"operation_types": ["UPDATE"],
"unordered": false,
"full_document": true,
"match": {}
},
"disabled": false
}
textShippingUpdate
exports = async function (changeEvent) {
// Destructure out fields from the change stream event object
const { updateDescription, fullDocument } = changeEvent;
// Check if the shippingLocation field was updated
const updatedFields = Object.keys(updateDescription.updatedFields);
const isNewLocation = updatedFields.some(field =>
field.match(/shippingLocation/)
);
// If the location changed, text the customer the updated location.
if (isNewLocation) {
const { customerId, shippingLocation } = fullDocument;
const mongodb = context.services.get("mongodb-atlas");
const customers = mongodb.db("store").collection("customers");
const { location } = shippingLocation.pop();
const customer = await customers.findOne({ _id: customerId });
const twilio = require('twilio')(
// Your Account SID and Auth Token from the Twilio console:
context.values.get("TwilioAccountSID"),
context.values.get("TwilioAuthToken"),
);
await twilio.messages.create({
To: customer.phoneNumber,
From: context.values.get("ourPhoneNumber"),
Body: `Your order has moved! The new location is ${location}.`
})
}
};

데이터베이스 트리거는 트리거의 change stream이 계속되지 못하게 하는 이벤트에 대한 응답으로 일시 중단 상태가 될 수 있습니다. 트리거를 일시 중지할 수 있는 이벤트는 다음과 같습니다.

  • dropDatabase, renameCollection 또는 네트워크 장애로 인한 이벤트를 무효화합니다.

  • 변경 스트림을 재개하는 데 필요한 재개 토큰이 더 이상 클러스터 oplog에 없습니다. 앱 로그는 이를 ChangeStreamHistoryLost 오류로 표시합니다.

트리거가 일시 중단되거나 실패하는 이벤트 Atlas 는 프로젝트 소유자에게 문제에 대해 경고하는 이메일 을 보냅니다.

다시 시작 토큰이 oplog에 더 이상 있지 않아서 Atlas Triggers가 일시 중단된 경우 자동으로 다시 시작하도록 트리거를 구성할 수 있습니다. 트리거는 다시 시작 토큰이 손실된 시점과 다시 시작 프로세스가 완료된 시점 사이에 누락된 변경 스트림 이벤트를 처리하지 않습니다.

Atlas UI 에서 데이터베이스 트리거를 생성하거나 업데이트하는 경우 :

  1. 일시 중단된 경우 자동으로 재개하려는 트리거의 구성 페이지로 이동합니다.

  2. Advanced (Optional) 섹션에서 Auto-Resume Triggers를 선택합니다.

  3. 변경 사항을 저장하고 배포합니다.

일시 중단된 트리거를 수동으로 다시 시작하면 앱은 change stream이 중지된 후 다음 change stream 이벤트에서 트리거를 다시 시작하려고 시도합니다. 재개 토큰이 더 이상 cluster oplog에 없는 경우 재개 토큰 없이 트리거를 시작해야 합니다. 이는 트리거가 새 이벤트 수신을 시작하지만 누락된 과거 이벤트를 프로세스하지 않음을 의미합니다.

| oplog | 클러스터 . oplog 크기를 클러스터의 최대 oplog 처리량 (GB/시간)보다 몇 배 더 크게 유지하여 트리거가 실행되기 전에 일시 중단된 트리거의 재개 토큰이 oplog 를 삭제할 위험을 줄입니다. |service| 의 Oplog GB/Hour 그래프 에서 클러스터의 oplog 처리량 을 확인하세요. 클러스터 지표.

일시 중단된 트리거는 Atlas UI 또는 App Services CLI 를 사용하여 다시 시작할 수 있습니다.

1
  1. 아직 표시되지 않은 경우 탐색 표시줄의 Organizations 메뉴에서 프로젝트가 포함된 조직을 선택합니다.

  2. 아직 표시되지 않은 경우 내비게이션 바의 Projects 메뉴에서 프로젝트를 선택합니다.

  3. 사이드바에서 Services 제목 아래의 Triggers 을 클릭합니다.

    트리거 페이지가 표시됩니다.

2

Triggers 페이지의 트리거 목록에서 비활성화하려는 트리거를 찾습니다. Atlas 는 일시 중단된 트리거를 Status Suspended 로 표시합니다.

3

트리거의 Actions 열에서 Restart 을(를) 클릭합니다. 변경 스트림 재개 토큰 으로 트리거를 다시 시작하거나 새 변경 스트림 을 열도록 선택할 수 있습니다.

재개 토큰을 사용할지 여부를 표시한 다음 Resume Database Trigger 을(를) 클릭합니다.

참고: 재개 토큰 을 사용하는 경우 Atlas 는 마지막으로 처리한 변경 이벤트 직후에 발생한 이벤트 에서 트리거의 기본 변경 스트림 재개를 시도합니다. 성공적인 하면 트리거가 일시 중단된 동안 발생한 모든 이벤트를 처리합니다. 재개 토큰을 사용하지 않는 경우 트리거는 새 이벤트 수신을 시작하지만 일시 중단된 동안 발생한 이벤트에 대해서는 실행되지 않습니다.

UI 의 데이터베이스 트리거 모달 재개
1

MongoDB Atlas 관리 API 키 를 사용하여 App Services CLI 에 로그인 합니다.

appservices login --api-key="<API KEY>" --private-api-key="<PRIVATE KEY>"
2

다음 명령을 실행하여 구성 파일의 로컬 복사본을 가져옵니다.

appservices pull --remote=<App ID>

기본값 으로 이 명령은 파일을 현재 작업 디렉토리 로 가져옵니다. 선택 사항인 --local 플래그를 사용하여 디렉토리 경로를 지정할 수 있습니다.

3

애플리케이션 의 새 사본을 내보낸 경우 일시 중단된 트리거에 대한 최신 구성 파일 이 이미 포함되어 있어야 합니다. /triggers 디렉토리 에서 트리거와 이름이 같은 트리거 구성 파일 을 살펴보면 구성 파일 이 있는지 확인할 수 있습니다.

4

트리거 구성 파일 이 있는지 확인한 후 구성을 앱 에 다시 푸시합니다. App Services 는 배포서버 에 포함된 일시 중단된 트리거를 자동으로 재개하려고 시도합니다.

appservices push

Atlas UI 의 트리거 목록에는 세 개의 타임스탬프가 표시됩니다.

마지막으로 수정한 날짜

트리거가 생성되었거나 가장 최근에 변경된 시간입니다.

최근 심장 박동

Atlas 는 Trigger가 마지막으로 실행 된 시간을 추적 합니다. 트리거가 이벤트를 전송하지 않는 경우 서버 는 하트비트를 전송하여 트리거의 재개 토큰이 최신 상태로 유지되도록 합니다. 가장 최근의 이벤트 는 Latest Heartbeat 로 표시됩니다.

마지막 클러스터 처리 시간

또한 Atlas 는 Trigger를 지원하는 변경 스트림 이 마지막으로 이벤트 를 방출한 시간인 Last Cluster Time Processed 을 추적 합니다. 가장 최근 하트비트 이후 이벤트가 없는 경우 Latest Heartbeat 보다 오래된 것입니다.

짧은 이벤트 버스트를 수신하는 컬렉션 (예: 일일 배치 작업 의 일부로 데이터 삽입)에서 트리거가 실행되는 경우 이벤트 순서 지정을 비활성화하는 것이 좋습니다.

순서가 지정된 트리거는 이전 이벤트의 함수 실행이 완료될 때까지 특정 이벤트 에 대한 함수가 실행될 때까지 기다립니다. 결과적으로 순서가 지정된 트리거는 각 순차적 트리거 함수의 실행 시간에 따라 속도가 효과적으로 제한됩니다. 이로 인해 변경 스트림 에 나타나는 데이터베이스 이벤트 와 트리거 실행 사이에 상당한 지연이 발생할 수 있습니다. 극단적인 경우 장기 실행 순서가 지정된 트리거가 이벤트를 처리하기 전에 데이터베이스 이벤트가 oplog 에서 제외될 수 있습니다.

순서가 지정되지 않은 트리거는 가능한 경우 함수를 병렬로 실행하므로 사용 사례 에 따라 훨씬 빠를 수 있지만 트리거 함수가 이벤트 순서대로 여러 번 실행된다는 보장은 없습니다.

문서 사전 이미지를 사용하려면 클러스터 가 컬렉션 의 각 작업에 대한 추가 데이터를 기록 해야 합니다. 컬렉션 의 트리거에 대한 사전 이미지를 활성화 하면 클러스터 에 컬렉션 의 모든 작업에 대한 사전 이미지가 저장됩니다.

추가 저장 공간과 컴퓨팅 오버헤드 는 클러스터 구성에 따라 트리거 성능을 저하시킬 수 있습니다.

사전 이미지의 저장 및 계산 오버헤드 를 방지하려면 전체 기본 MongoDB 컬렉션 에 대해 사전 이미지를 비활성화해야 합니다. 이는 개별 트리거의 사전 이미지 설정과는 별개의 설정입니다.

컬렉션 수준 사전 이미지를 비활성화하면 해당 컬렉션 의 활성 트리거가 사전 이미지를 사용할 수 없습니다. 그러나 컬렉션의 모든 사전 이미지 트리거를 삭제 하거나 비활성화한 경우 컬렉션 수준 사전 이미지를 비활성화할 수도 있습니다.

방법을 학습 보려면 컬렉션에 대한 사전 이미지 비활성화를 참조하세요.

Match Expression 필드 에 $match 표현식 을 지정하여 트리거 호출 횟수를 제한할 수 있습니다. Atlas 는 변경 이벤트 문서 를 기준으로 일치 표현식 을 평가하고, 지정된 변경 이벤트 에 대해 표현식 이 true로 평가되는 경우에만 트리거를 호출합니다.

일치 표현식은 MongoDB 읽기 쿼리 구문을 사용해 쿼리 조건을 지정하는 JSON document입니다.

Trigger 이벤트의 양이 측정 가능한 수준으로 성능 문제가 되는 경우에만 일치 표현식을 사용하는 것이 좋습니다. 그때까지 모든 이벤트를 수신하고 Trigger Function 코드에서 개별적으로 처리하다 합니다.

변경 이벤트 문서 의 정확한 형태는 트리거가 실행된 이벤트 에 따라 달라집니다. 자세한 내용은 각 이벤트 유형에 대한 참고 자료를 참조하세요.

다음 일치 표현식을 사용하면 변경 이벤트 객체가 문서의 status 필드가 변경되었음을 지정하는 경우에만 트리거가 실행될 수 있습니다.

updateDescription 이벤트 객체 업데이트의 필드입니다.

{
"updateDescription.updatedFields.status": {
"$exists": true
}
}

다음 일치 표현식을 사용하면 문서의 needsTriggerResponse 필드가 true인 경우에만 트리거가 실행되도록 할 수 있습니다. 삽입, 업데이트바꾸기 이벤트의 fullDocument 필드는 지정된 작업 후의 문서를 나타냅니다. fullDocument 필드를 수신하려면 트리거 구성에서 Full Document를 활성화해야 합니다.

{
"fullDocument.needsTriggerResponse": true
}

다음 절차에서는 일치 표현식이 예상대로 작동하는지 테스트하는 한 가지 방법을 보여줍니다.

  1. MongoDB Shell (mongosh) 을 다운로드 하여 클러스터 에 연결합니다.

  2. DB_NAME을 데이터베이스 이름으로, COLLECTION_NAME을 컬렉션 이름으로, YOUR_MATCH_EXPRESSION을 테스트하려는 일치 표현식으로 대체하고 다음을 mongosh에 붙여 넣어 기존 컬렉션에서 변경 스트림을 엽니다.

    db.getSiblingDB(DB_NAME).COLLECTION_NAME.watch([{$match: YOUR_MATCH_EXPRESSION}])
    while (!watchCursor.isClosed()) {
    if (watchCursor.hasNext()) {
    print(tojson(watchCursor.next()));
    }
    }
  3. 다른 터미널 창 에서 mongosh 를 사용하여 컬렉션 의 일부 테스트 문서를 변경합니다.

  4. 변경 스트림이 필터링을 통해 무엇을 남기고 무엇을 걸러 내는지 관찰합니다.

Project Expression 필드에서 $project 표현식을 사용하여 트리거가 처리하는 필드 수를 제한합니다.

참고

프로젝트만 포함

트리거를 사용할 때는 프로젝션 표현식 포함됩니다. 프로젝트는 포함과 제외의 혼합을 지원하지 않습니다. 트리거에는 operationType을 포함해야 하므로 프로젝트 표현식은 포괄적이어야 합니다.

단일 필드를 제외하려면 프로젝션 표현식에 제외할 필드를 제외한 모든 필드가 포함되어야 합니다. 기본적으로 포함된 _id만 명시적으로 제외할 수 있습니다.

트리거는 다음 Project Expression 으로 구성됩니다.

{
"_id": 0,
"operationType": 1,
"updateDescription.updatedFields.status": 1
}

Atlas 가 Trigger Function에 전달하는 변경 이벤트 객체 에는 다음 예시 와 같이 프로젝션 에 지정된 필드만 포함됩니다.

{
"operationType": "update",
"updateDescription": {
"updatedFields": {
"status": "InProgress"
}
}
}

다음도 참조하세요.

돌아가기

트리거