데이터 변경 사항 모니터링
이 페이지의 내용
개요
이 가이드 에서는 C 운전자 를 사용하여 데이터의 실시간 변경 사항을 볼 수 있도록 변경 스트림 을 모니터 하는 방법을 학습 수 있습니다. 변경 스트림 은 컬렉션, 데이터베이스 또는 배포서버 서버에 데이터 변경 사항을 게시하는 MongoDB Server 기능 입니다. 애플리케이션 은 변경 스트림 을 구독 하고 이벤트를 사용하여 다른 작업을 수행할 수 있습니다.
샘플 데이터
이 가이드 의 예제에서는 Atlas 샘플 데이터 세트 의 sample_restaurants
데이터베이스 에 있는 restaurants
컬렉션 을 사용합니다. 무료 MongoDB Atlas cluster 를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 Atlas 시작하기 가이드 를 참조하세요.
변경 스트림 열기
변경 스트림 을 열려면 관찰하려는 이벤트 범위에 해당하는 다음 함수 중 하나를 호출합니다.
mongoc_client_watch()
: MongoDB deployment 의 모든 변경 사항을 모니터링합니다.mongoc_database_watch()
: 데이터베이스 의 모든 컬렉션에서 변경 사항을 모니터링합니다.mongoc_collection_watch()
: 컬렉션 의 변경 사항을 모니터링합니다.
변경 스트림 예시 열기
다음 예시 에서는 restaurants
컬렉션 에서 변경 스트림 을 열고 변경 사항이 발생할 때 출력합니다.
bson_t *pipeline = bson_new (); const bson_t *doc; mongoc_change_stream_t *change_stream = mongoc_collection_watch (collection, pipeline, NULL); while (true) { bson_error_t error; if (mongoc_change_stream_next (change_stream, &doc)) { char *str = bson_as_canonical_extended_json (doc, NULL); printf ("Received change: %s\n", str); bson_free (str); } else if (mongoc_change_stream_error_document (change_stream, &error, NULL)) { printf("Got error on change stream: %s\n", error.message); break; } } bson_destroy (pipeline); mongoc_change_stream_destroy (change_stream);
변경 사항을 확인하려면 애플리케이션 을 실행 합니다. 그런 다음 별도의 애플리케이션 또는 셸 에서 restaurants
컬렉션 에 대한 쓰기 (write) 작업을 수행합니다. 다음 예시 에서는 name
필드 값이 "Blarney Castle"
인 문서 를 업데이트합니다.
bson_t *filter = BCON_NEW ("name", BCON_UTF8 ("Blarney Castle")); bson_t *update = BCON_NEW("$set", "{", "cuisine", BCON_UTF8 ("Irish"), "}"); mongoc_collection_update_one (collection, filter, update, NULL, NULL, NULL);
컬렉션을 업데이트하면 변경 스트림 애플리케이션은 변경 사항이 발생하는 즉시 출력합니다. 인쇄된 변경 이벤트는 다음과 유사합니다.
{ "_id": { ... }, "operationType": "update", "clusterTime": { ... }, "ns": { "db": "sample_restaurants", "coll": "restaurants" }, "updateDescription": { "updatedFields": { "cuisine": "Irish" }, "removedFields": [], "truncatedArrays": [] } ... }
변경 스트림 출력 수정
pipeline
매개변수를 모든 watch 함수에 전달하여 변경 스트림 출력을 수정할 수 있습니다. 이 매개변수를 사용하면 지정된 변경 이벤트만 감시할 수 있습니다. 매개변수의 형식을 객체 목록으로 지정하며, 각 객체 는 집계 단계를 나타냅니다.
pipeline
매개변수에 다음 단계를 지정할 수 있습니다.
$addFields
$match
$project
$replaceRoot
$replaceWith
$redact
$set
$unset
특정 이벤트 일치 예시
다음 예시 에서는 pipeline
매개변수를 사용하여 업데이트 작업만 기록하는 변경 스트림 을 여는 $match
단계를 포함합니다.
bson_t *pipeline = BCON_NEW ( "pipeline", "[", "{", "$match", "{", "operationType", BCON_UTF8 ("update"), "}", "}", "]"); const bson_t *doc; mongoc_change_stream_t *change_stream = mongoc_collection_watch (collection, pipeline, NULL); while (mongoc_change_stream_next (change_stream, &doc)) { char *str = bson_as_canonical_extended_json (doc, NULL); printf ("Received change: %s\n", str); bson_free (str); } bson_destroy (pipeline); mongoc_change_stream_destroy (change_stream);
변경 스트림 출력 수정에 대해 자세히 알아보려면 MongoDB Server 매뉴얼의 변경 스트림 출력 수정 섹션을 참조하세요.
감시 동작 수정
함수 호출에 옵션을 전달하여 모든 감시 함수를 수정할 수 있습니다. 옵션을 지정하지 않으면 운전자 는 작업을 사용자 지정하지 않습니다.
다음 표에서는 감시 기능의 동작을 사용자 지정하는 데 사용할 수 있는 옵션에 대해 설명합니다.
옵션 | 설명 |
---|---|
| Sets the number of documents to return per batch. |
| Specifies a comment to attach to the operation. |
| Sets the fullDocument value. To learn more, see the
Include Pre-Images and Post-Images section of this document. |
| Sets the fullDocumentBeforeChange value. To learn more, see the
Include Pre-Images and Post-Images section of this document. |
| Sets the maximum await execution time on the server for this operation, in
milliseconds. |
감시 작업을 구성하는 데 사용할 수 있는 옵션의 전체 목록은 MongoDB Server 매뉴얼의 감시 메서드 가이드 를 참조하세요.
사전 이미지 및 사후 이미지 포함하기
중요
배포에서 MongoDB v6.0 이상을 사용하는 경우에만 컬렉션에서 사전 이미지 및 사후 이미지를 활성화할 수 있습니다.
기본값 으로 컬렉션 에서 작업을 수행할 때 해당 변경 이벤트 에는 해당 작업에 의해 수정된 필드의 델타만 포함됩니다. 변경 전후의 전체 문서 를 보려면 watch 함수 호출에서 fullDocumentBeforeChange
또는 fullDocument
옵션을 지정합니다.
사전 이미지는 변경 전의 문서 전체 버전입니다. 변경 스트림 이벤트 에 사전 이미지를 포함하려면 fullDocumentBeforeChange
옵션에 다음 값 중 하나를 전달합니다.
whenAvailable
: 변경 이벤트에는 사전 이미지를 사용할 수 있는 경우에만 변경 이벤트에 대해 수정된 문서의 사전 이미지가 포함됩니다.required
: 변경 이벤트에는 변경 이벤트에 대한 수정된 문서의 사전 이미지가 포함됩니다. 사전 이미지를 사용할 수 없는 경우 드라이버에서 오류가 발생합니다.
사후 이미지는 변경 후 문서 의 전체 버전입니다. 변경 스트림 이벤트 에 사후 이미지를 포함하려면 다음 값 중 하나를 fullDocument
옵션에 전달합니다.
updateLookup
: 변경 이벤트에는 변경 후 일정 시간 이후의 변경된 문서 전체의 복사본이 포함됩니다.whenAvailable
: 변경 이벤트에는 사후 이미지를 사용할 수 있는 경우에만 변경 이벤트에 대해 수정된 문서의 사후 이미지가 포함됩니다.required
: 변경 이벤트에는 변경 이벤트에 대한 수정된 문서의 사후 이미지가 포함됩니다. 사후 이미지를 사용할 수 없는 경우 드라이버에서 오류가 발생합니다.
다음 예시 에서는 컬렉션 에서 mongoc_collection_watch()
함수를 호출하고 fullDocument
옵션을 지정하여 업데이트된 문서의 사후 이미지를 결과에 포함합니다.
bson_t *pipeline = bson_new (); bson_t *opts = BCON_NEW ("fullDocument", BCON_UTF8 ("updateLookup")); const bson_t *doc; mongoc_change_stream_t *change_stream = mongoc_collection_watch (collection, pipeline, opts); while (true) { bson_error_t error; if (mongoc_change_stream_next (change_stream, &doc)) { char *str = bson_as_canonical_extended_json (doc, NULL); printf ("Received change: %s\n", str); bson_free (str); } else if (mongoc_change_stream_error_document (change_stream, &error, NULL)) { printf("Got error on change stream: %s\n", error.message); break; } } bson_destroy (pipeline); bson_destroy (opts); mongoc_change_stream_destroy (change_stream);
변경 스트림 애플리케이션이 실행 중인 상태에서 앞의 업데이트 예시 를 사용하여 restaurants
컬렉션의 문서를 업데이트하면 다음과 유사한 변경 이벤트가 출력됩니다.
{ "_id": ..., "operationType": "update", "clusterTime": ..., "wallTime": ..., "fullDocument": { "_id": { ... }, "address": ..., "borough": "Queens", "cuisine": "Irish", "grades": [ ... ], "name": "Blarney Castle", "restaurant_id": ... }, "ns": { "db": "sample_restaurants", "coll": "restaurants" }, "documentKey": { "_id": ... }, "updateDescription": { "updatedFields": { "cuisine": "Irish" }, "removedFields": [], "truncatedArrays": [] } }
사전 이미지 및 사후 이미지에 대해 자세히 알아보려면 Change Streams 매뉴얼에서 문서 사전 및 사후 이미지로 MongoDB Server 을 참조하세요.
추가 정보
변경 스트림에 대해 자세히 알아보려면 Change Streams 매뉴얼의 MongoDB Server 을 참조하세요.
API 문서
이 가이드 에 설명된 함수 또는 유형에 학습 보려면 다음 API 문서를 참조하세요.