개요
이 가이드에서는 변경 스트림 을 사용하여 데이터베이스의 실시간 변경 사항을 모니터링하는 방법을 배울 수 있습니다. 변경 스트림은 애플리케이션이 컬렉션, 데이터베이스 또는 배포의 데이터 변경 사항을 구독할 수 있도록 하는 MongoDB Server 기능입니다.
C++ 운전자 를 사용하는 경우 mongocxx::change_stream 을(를) 인스턴스화하여 데이터 변경 사항을 모니터 할 수 있습니다.
샘플 데이터
이 가이드 의 예제에서는 Atlas 샘플 데이터 세트 의 sample_restaurants 데이터베이스 에 있는 restaurants 컬렉션 을 사용합니다. C++ 애플리케이션 에서 이 컬렉션 에 액세스 하려면 Atlas cluster 에 연결하는 mongocxx::client 를 인스턴스화하고 db 및 collection 변수에 다음 값을 할당합니다.
auto db = client["sample_restaurants"]; auto collection = db["restaurants"];
무료 MongoDB Atlas 클러스터 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB 시작하기 가이드 를 참조하세요.
변경 스트림 열기
변경 스트림을 열려면 watch() 메서드를 호출합니다. watch() 메서드를 호출하는 인스턴스에 따라 변경 스트림이 수신 대기하는 이벤트 범위가 결정됩니다. 다음 클래스에서 watch() 메서드를 호출할 수 있습니다.
mongocxx::client: MongoDB deployment 의 모든 변경 사항을 모니터링합니다.mongocxx::database: 데이터베이스 내 모든 컬렉션의 변경 사항 모니터링mongocxx::collection: 컬렉션 의 변경 사항 모니터링
다음 예시에서는 restaurants 컬렉션에서 변경 스트림을 열고 변경 사항이 발생할 때 출력합니다.
auto stream = collection.watch(); while (true) { for (const auto& event : stream) { std::cout << bsoncxx::to_json(event) << std::endl; } }
변경 사항을 확인하려면 앞의 코드를 실행 하세요. 그런 다음 별도의 애플리케이션 또는 shell 에서 restaurants 컬렉션 을 수정합니다. 다음 예시 에서는 name 필드 값이 Blarney Castle 인 문서 를 업데이트합니다.
auto result = collection.update_one(make_document(kvp("name", "Blarney Castle")), make_document(kvp("$set", make_document(kvp("cuisine", "Irish")))));
컬렉션 을 업데이트 하면 변경 스트림 애플리케이션 은 변경 사항이 발생하는 즉시 출력합니다. 인쇄된 변경 이벤트 는 다음 출력과 유사합니다.
{ "_id" : { "_data" : "..." }, "operationType" : "update", "clusterTime" : { "$timestamp" : { ... }, "wallTime" : { "$date" : ... }, "ns" : { "db" : "sample_restaurants", "coll" : "restaurants" }, "documentKey" : { "_id" : { "$oid" : "..." } }, "updateDescription" : { "updatedFields" : { "cuisine" : "Irish" }, "removedFields" : [ ], "truncatedArrays" : [ ] } }
변경 스트림 출력 수정
mongocxx::pipeline 인스턴스 를 watch() 메서드에 인수로 전달하여 변경 스트림 출력을 수정할 수 있습니다. 다음 목록에는 해당 setter 메서드를 호출하여 설정하다 수 있는 일부 mongocxx::pipeline 필드가 포함되어 있습니다.
add_fields: 문서에 새 필드를 추가합니다.match: 문서를 필터링합니다.project: 문서 필드의 하위 집합을 프로젝션합니다.redact: 문서의 내용을 제한합니다.group: 지정된 표현식 을 기준으로 문서를 그룹화합니다.merge: 결과를 컬렉션 에 출력
팁
mongocxx::pipeline 필드의 전체 목록은 mongocxx::파이프라인 API 설명서를 참조하세요.
다음 예시 에서는 mongocxx::pipeline 인스턴스 의 match 필드 를 설정한 다음 파이프라인 을 watch() 메서드에 전달합니다. 이는 watch() 메서드가 업데이트 작업만 출력하도록 지시합니다.
mongocxx::pipeline pipeline; pipeline.match(make_document(kvp("operationType", "update"))); auto stream = collection.watch(pipeline); while (true) { for (const auto& event : stream) { std::cout << bsoncxx::to_json(event) << std::endl; } }
watch() 동작 수정
mongocxx::options::change_stream 클래스의 인스턴스 를 매개변수로 전달하여 watch() 메서드의 동작을 수정할 수 있습니다. 다음 표에서는 mongocxx::options::find 인스턴스 에서 설정하다 수 있는 필드에 대해 설명합니다.
필드 | 설명 |
|---|---|
| 문서의 변경 사항만 표시하지 않고 변경 후 전체 문서를 표시할지 여부를 지정합니다. 이 옵션에 대해 자세히 알아보려면 사전 이미지 및 사후 이미지 포함 을 참조하세요. |
| 문서의 변경 사항만 표시하는 대신 변경 전의 전체 문서를 표시할지 여부를 지정합니다. 이 옵션에 대해 자세히 알아보려면 사전 이미지 및 사후 이미지 포함 을 참조하세요. |
|
|
| 재개 토큰에 지정된 |
|
|
| 서버 빈 배치 를 반환하기 전에 변경 스트림 커서 에 보고하기 위해 새 데이터 변경 사항을 기다리는 최대 시간(밀리초)을 설정합니다. 기본값은 1000 밀리초입니다. |
| MongoDB cluster 의 각 응답 배치 에서 반환할 최대 변경 이벤트 수를 설정합니다. |
| 변경 스트림 커서 에 사용할 데이터 정렬을 설정합니다. |
| 작업에 주석을 첨부합니다. |
사전 이미지 및 사후 이미지 포함하기
중요
배포에서 MongoDB v6.0 이상을 사용하는 경우에만 컬렉션에서 사전 이미지 및 사후 이미지를 활성화할 수 있습니다.
기본값 으로 컬렉션 에서 작업을 수행할 때 해당 변경 이벤트 에는 해당 작업에 의해 수정된 필드의 델타만 포함됩니다. 변경 전후의 전체 문서 를 보려면 mongocxx::options::change_stream 인스턴스 의 full_document_before_change 또는 full_document 필드를 지정합니다.
사전 이미지 는 변경 전의 문서 전체 버전입니다. 변경 스트림 이벤트 에 사전 이미지를 포함하려면 full_document_before_change 필드 를 다음 문자열 중 하나로 설정하다 합니다.
"whenAvailable": 변경 이벤트에는 사전 이미지를 사용할 수 있는 경우에만 변경 이벤트에 대해 수정된 문서의 사전 이미지가 포함됩니다."required": 변경 이벤트에는 변경 이벤트에 대한 수정된 문서의 사전 이미지가 포함됩니다. 사전 이미지를 사용할 수 없는 경우 드라이버에서 오류가 발생합니다.
사후 이미지 는 변경 후 문서 의 전체 버전입니다. 변경 스트림 이벤트 에 사후 이미지를 포함하려면 full_document 필드 를 다음 문자열 중 하나로 설정하다 합니다.
"updateLookup": 변경 이벤트에는 변경 후 일정 시간 이후의 변경된 문서 전체의 복사본이 포함됩니다."whenAvailable": 변경 이벤트에는 사후 이미지를 사용할 수 있는 경우에만 변경 이벤트에 대해 수정된 문서의 사후 이미지가 포함됩니다."required": 변경 이벤트에는 변경 이벤트에 대한 수정된 문서의 사후 이미지가 포함됩니다. 사후 이미지를 사용할 수 없는 경우 드라이버에서 오류가 발생합니다.
다음 예시 에서는 컬렉션 에서 watch() 메서드를 호출하고 mongocxx::options::change_stream 인스턴스 의 full_document 필드 를 설정하여 업데이트된 문서의 사후 이미지를 포함합니다.
mongocxx::options::change_stream opts; opts.full_document("updateLookup"); auto stream = collection.watch(opts); while (true) { for (const auto& event : stream) { std::cout << bsoncxx::to_json(event) << std::endl; } }
변경 스트림 애플리케이션 실행 에서 앞의 업데이트 예시 를 사용하여 restaurants 컬렉션 의 문서 를 업데이트하면 다음 코드와 유사한 변경 이벤트 가 출력됩니다.
{ "_id" : { "_data" : "..." }, "operationType" : "update", "clusterTime" : { "$timestamp" : { ... } }, "wallTime" : { "$date" : ... }, "fullDocument" : { "_id" : { "$oid" : "..." }, "address" : { "building" : "202-24", "coord" : [ -73.925044200000002093, 40.559546199999999772 ], "street" : "Rockaway Point Boulevard", "zipcode" : "11697" }, "borough" : "Queens", "cuisine" : "Irish", "grades" : [ ... ], "name" : "Blarney Castle", "restaurant_id" : "40366356" }, "ns" : { "db" : "sample_restaurants", "coll" : "restaurants" }, "documentKey" : { "_id" : { "$oid" : "..." } }, "updateDescription" : { "updatedFields" : { "cuisine" : "Irish" }, "removedFields" : [ ], "truncatedArrays" : [ ] } }
팁
사전 이미지 및 사후 이미지에 대해 자세히 알아보려면 Change Streams 매뉴얼에서 문서 사전 및 사후 이미지로 MongoDB Server 을 참조하세요.
추가 정보
변경 스트림에 대해 자세히 알아보려면 Change Streams 매뉴얼의 MongoDB Server 을 참조하세요.
API 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.