Change Streams 열기
이 페이지의 내용
개요
이 가이드에서는 change stream을 사용하여 데이터의 실시간 변경 사항을 모니터링하는 방법을 배울 수 있습니다. change stream은 애플리케이션이 단일 collection, 데이터베이스 또는 배포에서 데이터 변경 사항을 구독할 수 있도록 하는 MongoDB Server 기능입니다.
다음 조치를 수행하는 데 도움이 되는 change stream을 열 수 있습니다.
디바이스가 동작 감지 카메라와 같은 이벤트를 추적하고 React 수 있도록 합니다.
주가 변화를 모니터링하는 애플리케이션 만들기
특정 작업에 대한 직원 활동 로그 생성
애그리게이션 연산자 세트를 지정하여 애플리케이션이 수신하는 데이터를 필터링하고 변환할 수 있습니다. MongoDB deployment v6.0 이상에 연결된 경우 변경 전후의 문서 데이터를 포함하도록 이벤트를 구성할 수도 있습니다.
change stream을 열고 구성하는 방법을 알아보려면 다음 섹션으로 이동하세요.
샘플 데이터
이 가이드의 예에서는 directors
collection의 변경 사항을 모니터링합니다. 이 collection에 구조체로 모델링된 다음 문서가 포함되어 있다고 가정합니다.
let docs = vec! [ Director { name: "Todd Haynes".to_string(), movies: vec! ["Far From Heaven".to_string(), "Carol".to_string()], oscar_noms: 1, }, Director { name: "Jane Campion".to_string(), movies: vec! ["The Piano".to_string(), "Bright Star".to_string()], oscar_noms: 5, } ];
팁
컬렉션 에 문서를 삽입하는 방법을 학습 보려면 문서 삽입 가이드 를 참조하세요.
변경 스트림 열기
change stream을 열어 특정 유형의 데이터 변경 사항을 구독하고 애플리케이션에서 변경 이벤트를 생성할 수 있습니다.
change stream을 열려면 Collection
, Database
또는 Client
인스턴스에서 watch()
메서드를 호출합니다.
중요
독립형 MongoDB 배포는 변경 스트림을 지원 하지 않는데, 이는 이 기능 에 복제본 세트 oplog 가 필요하기 때문입니다. oplog 에 학습 보려면 서버 매뉴얼의 복제본 세트 oplog 페이지를 참조하세요.
watch()
메서드를 호출하는 구조체 유형에 따라 change stream이 수신하는 이벤트 범위가 결정됩니다. 다음 표에서는 호출 객체에 따른 watch()
메서드의 동작을 설명합니다.
구조체 유형 | 동작 watch() |
---|---|
Collection | Monitors changes to the individual collection |
Database | Monitors changes to all collections in the database |
Client | Monitors all changes in the connected MongoDB deployment |
예시
다음 예시에서는 directors
collection에서 change stream을 엽니다. 이 코드는 각 인스턴스의 필드 및 필드에 액세스하여 각 이벤트의 작업 유형과 수정된 문서를 operation_type
full_document
ChangeStreamEvent
인쇄합니다.
let mut change_stream = my_coll.watch().await?; while let Some(event) = change_stream.next().await.transpose()? { println!("Operation performed: {:?}", event.operation_type); println!("Document: {:?}", event.full_document); }
팁
구조체 필드의 전체 목록은 ChangeStreamEvent
API 문서에서 ChangeStreamEvent 를 참조하세요.
값이 인 collection에 문서를 directors
name
"Wes Anderson"
삽입하는 경우 앞의 코드는 다음과 같은 출력을 생성합니다.
Operation performed: Insert Document: Some(Director { name: "Wes Anderson", movies: [...], oscar_noms: 7 })
change stream에 애그리게이션 연산자 적용
pipeline()
메서드를 watch()
메서드에 연결하여 변경 스트림 이 수신할 변경 이벤트를 지정할 수 있습니다. 집계 파이프라인 을 pipeline()
에 매개 변수로 전달합니다.
사용 중인 MongoDB Server 버전에서 지원하는 집계 연산자를 학습 보려면 서버 매뉴얼의 변경 스트림 출력 수정 을 참조하세요.
예시
다음 예에서는 업데이트 작업을 필터링하는 집계 파이프라인을 만듭니다. 그런 다음 이 코드는 파이프라인을 pipeline()
메서드에 전달하여 업데이트 작업에 대한 change stream 이벤트만 수신하고 출력하도록 change stream을 구성합니다.
let mut update_change_stream = my_coll.watch() .pipeline(vec![doc! { "$match" : doc! { "operationType" : "update" } }]) .await?; while let Some(event) = update_change_stream.next().await.transpose()? { println!("Update performed: {:?}", event.update_description); }
oscar_noms
필드의 값을 늘려 name
값이 "Todd Haynes"
인 문서를 업데이트하는 경우 앞의 코드는 다음과 같은 출력을 생성합니다.
Update performed: Some(UpdateDescription { updated_fields: Document({ "oscar_noms": Int64(2)}), removed_fields: [], truncated_arrays: Some([]) })
팁
업데이트 작업을 수행하는 방법을 알아보려면 문서 수정 가이드를 참조하세요.
사전 이미지 및 사후 이미지 포함하기
다음 데이터를 포함하거나 생략하도록 변경 이벤트를 구성할 수 있습니다.
사전 이미지: 작업 전의 문서의 버전을 나타내는 문서(있는 경우)
사후 이미지: 작업 후의 문서의 버전을 나타내는 문서(있는 경우)
중요
배포에서 MongoDB v6.0 이상을 사용하는 경우에만 collection에서 사전 및 사후 이미지를 활성화할 수 있습니다.
사전 이미지 또는 사후 이미지가 포함된 변경 스트림 이벤트를 수신하려면 다음 작업을 수행해야 합니다.
MongoDB deployment에서 collection에 대한 사전 이미지 및 사후 이미지를 활성화합니다.
팁
배포에서 사전 및 사후 이미지를 활성화하는 방법에 대한 자세한 내용은 서버 설명서의 Change Streams with Document Pre- and Post-Images(이미지 사전 및 사후 문서화의 Change Streams)를 참조하세요.
사전 이미지 및 사후 이미지가 활성화된 컬렉션을 생성하도록 드라이버에 지시하는 방법을 알아보려면 이 페이지의 사전 이미지 및 사후 이미지가 활성화된 컬렉션 생성 섹션을 참조하세요.
사전 이미지와 사후 이미지 중 하나 또는 둘 다를 검색하도록 change stream을 구성합니다. 이 구성 중에 사전 및 사후 이미지를 요구하거나 사용 가능한 경우에만 포함하도록 드라이버에 지시할 수 있습니다.
팁
변경 이벤트에 사전 이미지를 기록 하도록 변경 스트림 을 구성하려면 이 페이지의 사전 이미지 구성 예시 를 참조하세요.
변경 이벤트의 사후 이미지를 기록하도록 변경 스트림을 구성하려면 이 페이지의 사후 이미지 구성 예제 를 참조하세요.
사전 이미지 및 사후 이미지를 활성화하여 collection 만들기
컬렉션 에 대해 사전 이미지 및 사후 이미지 문서를 활성화 하려면 change_stream_pre_and_post_images()
옵션 빌더 메서드를 사용합니다. 다음 예시 에서는 이 빌더 메서드를 사용하여 컬렉션 옵션을 지정하고 사전 및 사후 이미지를 사용할 수 있는 컬렉션 을 만듭니다.
let enable = ChangeStreamPreAndPostImages::builder().enabled(true).build(); let result = my_db.create_collection("directors") .change_stream_pre_and_post_images(enable) .await?;
MongoDB Shell 또는 애플리케이션에서 collMod
명령을 실행하여 기존 컬렉션의 사전 이미지 및 사후 이미지 옵션을 변경할 수 있습니다. 이 작업을 수행하는 방법을 알아보려면 명령 실행 가이드 및 MongoDB Server 매뉴얼의 collMod 항목을 참조하세요.
경고
collection에서 사전 이미지 또는 사후 이미지를 활성화한 경우 collMod
으)로 이러한 설정을 수정하면 해당 collection의 기존 change stream이 종료될 수 있습니다.
사전 이미지 구성 예시
사전 이미지가 포함된 변경 이벤트를 반환하는 변경 스트림 을 구성하려면 full_document_before_change()
옵션 빌더 메서드를 사용합니다. 다음 예시 에서는 변경 스트림 옵션을 지정하고 사전 이미지 문서를 반환하는 변경 스트림 을 생성합니다.
let pre_image = FullDocumentBeforeChangeType::Required; let mut change_stream = my_coll.watch() .full_document_before_change(pre_image) .await?; while let Some(event) = change_stream.next().await.transpose()? { println!("Operation performed: {:?}", event.operation_type); println!("Pre-image: {:?}", event.full_document_before_change); }
앞의 예시 에서는 FullDocumentBeforeChangeType::Required
값을 full_document_before_change()
옵션 빌더 메서드에 전달합니다. 이 메서드는 바꾸기, 업데이트 및 삭제 변경 이벤트에 대한 사전 이미지를 요구하도록 변경 스트림 을 구성합니다. 사전 이미지를 사용할 수 없는 경우 운전자 에서 오류가 발생합니다.
name
값이 "Jane Campion"
인 문서를 업데이트하면 변경 이벤트가 다음과 같은 출력을 생성합니다.
Operation performed: Update Pre-image: Some(Director { name: "Jane Campion", movies: ["The Piano", "Bright Star"], oscar_noms: 5 })
사후 이미지 구성 예시
사후 이미지가 포함된 변경 이벤트를 반환하는 변경 스트림 을 구성하려면 full_document()
옵션 빌더 메서드를 사용합니다. 다음 예시 에서는 변경 스트림 옵션을 지정하고 이미지 후 문서를 반환하는 변경 스트림 을 생성합니다.
let post_image = FullDocumentType::WhenAvailable; let mut change_stream = my_coll.watch() .full_document(post_image) .await?; while let Some(event) = change_stream.next().await.transpose()? { println!("Operation performed: {:?}", event.operation_type); println!("Post-image: {:?}", event.full_document); }
앞의 예시 에서는 FullDocument::WhenAvailable
값을 full_document()
옵션 빌더 메서드에 전달합니다. 이 메서드는 사후 이미지를 사용할 수 있는 경우 교체, 업데이트 및 삭제 변경 이벤트에 대한 사후 이미지를 반환하도록 변경 스트림 을 구성합니다.
name
값이 "Todd Haynes"
인 문서를 삭제하면 변경 이벤트가 다음과 같은 출력을 생성합니다.
Operation performed: Delete Post-image: None
추가 정보
API 문서
이 가이드에 언급된 메서드나 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.