Docs Menu
Docs Home
/ / /
C 드라이버
/

데이터 변경 사항 모니터링

이 페이지의 내용

  • 개요
  • 샘플 데이터
  • 변경 스트림 열기
  • 변경 스트림 예시 열기
  • 변경 스트림 출력 수정
  • 특정 이벤트 일치 예시
  • 감시 동작 수정
  • 사전 이미지 및 사후 이미지 포함하기
  • 추가 정보
  • API 문서

이 가이드 에서는 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 매뉴얼의 변경 스트림 출력 수정 섹션을 참조하세요.

함수 호출에 옵션을 전달하여 모든 감시 함수를 수정할 수 있습니다. 옵션을 지정하지 않으면 운전자 는 작업을 사용자 지정하지 않습니다.

다음 표에서는 감시 기능의 동작을 사용자 지정하는 데 사용할 수 있는 옵션에 대해 설명합니다.

옵션
설명

batchSize

Sets the number of documents to return per batch.

comment

Specifies a comment to attach to the operation.

fullDocument

Sets the fullDocument value. To learn more, see the Include Pre-Images and Post-Images section of this document.

fullDocumentBeforeChange

Sets the fullDocumentBeforeChange value. To learn more, see the Include Pre-Images and Post-Images section of this document.

maxAwaitTimeMS

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 문서를 참조하세요.

돌아가기

커서에서 데이터 액세스