개요
이 가이드 에서는 변경 스트림 을 사용하여 데이터의 실시간 변경 사항을 모니터 하는 방법을 학습 수 있습니다. 변경 스트림 은 애플리케이션 이 컬렉션, 데이터베이스 또는 배포서버 서버의 데이터 변경 사항을 구독 할 수 있도록 하는 MongoDB Server 기능 입니다.
Ruby 운전자 사용하는 경우 watch 메서드를 호출하여 Mongo::Collection::View::ChangeStream 객체 반환할 수 있습니다. 그런 다음 콘텐츠를 반복하여 업데이트, 삽입 및 삭제와 같은 데이터 변경 사항을 모니터 할 수 있습니다.
샘플 데이터
이 가이드 의 예제에서는 Atlas 샘플 데이터 세트의 sample_restaurants 데이터베이스 에 있는 restaurants 컬렉션 사용합니다. Ruby 애플리케이션 에서 이 컬렉션 에 액세스 하려면 Atlas cluster 에 연결하는 Mongo::Client 객체 만들고 database 및 collection 변수에 다음 값을 할당합니다.
database = client.use('sample_restaurants') collection = database[:restaurants]
무료 MongoDB Atlas 클러스터 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB 시작하기 가이드 를 참조하세요.
변경 스트림 열기
변경 스트림 열려면 watch 메서드를 호출합니다. watch 메서드를 호출하는 객체 에 따라 변경 스트림 모니터링하는 이벤트 범위가 결정됩니다. 다음 객체에서 watch 메서드를 호출할 수 있습니다.
Mongo::Database: 하나의 데이터베이스 에 있는 모든 컬렉션의 변경 사항을 모니터링합니다.Mongo::Collection: 하나의 컬렉션 에 대한 변경 사항을 모니터링합니다.
다음 예시에서는 restaurants 컬렉션에서 변경 스트림을 열고 변경 사항이 발생할 때 출력합니다.
stream = collection.watch stream.each do |doc| puts doc break if doc['operationType'] == 'invalidate' end
변경 사항을 확인하려면 앞의 코드를 실행 하세요. 그런 다음 별도의 shell 에서 restaurants 컬렉션 을 수정합니다. 다음 예시 에서는 name 필드 값이 'Blarney Castle' 인 문서 를 업데이트합니다.
collection.update_one( { 'name' => 'Blarney Castle' }, { '$set' => { 'cuisine' => 'Irish' } } )
컬렉션 을 업데이트 하면 변경 스트림 애플리케이션 은 변경 사항이 발생하는 즉시 출력합니다. 인쇄된 변경 이벤트 는 다음 출력과 유사합니다.
{"_id"=>{"_data"=>"..."}, "operationType"=>"update", "clusterTime"=>#<...>, "ns"=>{"db"=>"sample_restaurants", "coll"=>"restaurants"}, "documentKey"=> {"_id"=>BSON::ObjectId('...')}, "updateDescription"=>{"updatedFields"=> {"cuisine"=>"Irish"}, "removedFields"=>[], "truncatedArrays"=>[]}}
변경 스트림 출력 수정
변경 스트림 출력을 수정하려면 배열 의 파이프라인 단계를 watch 메서드에 매개 변수로 전달하면 됩니다. 배열 에 다음 단계를 포함할 수 있습니다.
$addFields또는$set: 문서에 새 필드를 추가합니다.$match: 문서를 필터링합니다.$project: 문서 필드의 하위 집합을 프로젝션합니다.$replaceWith또는$replaceRoot: 입력 문서 를 지정된 문서 로 바꿉니다.$redact: 문서의 내용을 제한합니다.$unset: 문서에서 필드를 제거합니다.
다음 예시 에서는 $match 단계가 포함된 파이프라인 을 watch 메서드에 전달합니다. 이는 업데이트 작업이 발생할 때만 이벤트를 출력하도록 watch 메서드에 지시합니다.
pipeline = [{ '$match' => { 'operationType' => 'update' } }] stream = collection.watch(pipeline) stream.each do |doc| puts doc break if doc['operationType'] == 'invalidate' end
감시 동작 수정
watch 메서드의 동작을 수정하려면 옵션 해시를 watch에 매개 변수로 전달하면 됩니다. 다음 표에서는 설정하다 수 있는 몇 가지 옵션에 대해 설명합니다.
옵션 | 설명 |
|---|---|
| 문서 의 변경 사항만 표시하는 대신 변경 후 전체 문서 표시할지 여부를 지정합니다. 이 옵션에 대해 자세히 학습 이 가이드 의 사전 이미지 및 사후 이미지 포함 섹션을 참조하세요. |
| 문서 의 변경 사항만 표시하는 대신 변경 전의 전체 문서 표시할지 여부를 지정합니다. 이 옵션에 대해 자세히 학습 사전 이미지 및 사후 이미지 포함을 참조하세요. |
| 변경 스트림 의 논리적 점 지정합니다. |
| 지정된 타임스탬프 또는 그 이후에 발생한 변경 사항만 제공하도록 변경 스트림 에 지시합니다. |
| 변경 스트림 커서 에 사용할 데이터 정렬을 설정합니다. |
watch 옵션의 전체 목록은 API 설명서의 보기 를 참조하세요.
사전 이미지 및 사후 이미지 포함하기
중요
배포에서 MongoDB v6.0 이상을 사용하는 경우에만 컬렉션에서 사전 이미지 및 사후 이미지를 활성화할 수 있습니다.
기본값 으로 컬렉션 에서 작업을 수행할 때 해당 변경 이벤트 작업 전후에 수정된 필드와 해당 값만 포함됩니다.
watch 메서드에 수정된 필드 외에도 문서의 사전 이미지, 변경 전 문서의 전체 버전을 반환하도록 지시할 수 있습니다. 변경 스트림 이벤트 에 사전 이미지를 포함하려면 full_document_before_change 옵션을 설정하는 watch 에 옵션 해시를 전달합니다. 이 옵션을 다음 문자열 값으로 설정하다 수 있습니다.
'whenAvailable': 변경 이벤트 에는 변경 이벤트에 대한 수정된 문서 의 사전 이미지가 포함됩니다. 사전 이미지를 사용할 수 없는 경우 이 변경 이벤트 필드 의 값은nil입니다.'required': 변경 이벤트 에는 변경 이벤트에 대한 수정된 문서 의 사전 이미지가 포함됩니다. 사전 이미지를 사용할 수 없는 경우 서버 에서 오류가 발생합니다.'off': (기본값) 변경 이벤트 수정된 문서 의 사전 이미지가 포함되지 않습니다.
메서드에 수정된 필드 외에도 문서의 사후 이미지 변경 후 문서 의 전체 버전을 반환하도록 지시할 수도 있습니다.watch 변경 스트림 이벤트 에 사후 이미지를 포함하려면 full_document 옵션을 설정하는 watch 에 옵션 해시를 전달합니다. 이 옵션을 다음 문자열 값으로 설정하다 수 있습니다.
'updateLookup': 변경 이벤트에는 변경 후 일정 시간 이후의 변경된 문서 전체의 복사본이 포함됩니다.'whenAvailable': 변경 이벤트 에는 변경 이벤트에 대한 수정된 문서 의 사후 이미지가 포함됩니다. 사후 이미지를 사용할 수 없는 경우 이 변경 이벤트 필드 의 값은nil입니다.'required': 변경 이벤트 에는 변경 이벤트에 대한 수정된 문서 의 사후 이미지가 포함됩니다. 사후 이미지를 사용할 수 없는 경우 서버 에서 오류가 발생합니다.'default': (기본값) 변경 이벤트 수정된 문서 의 사후 이미지가 포함되지 않습니다.
다음 예시 에서는 컬렉션 에서 watch 메서드를 호출하고 full_document 옵션을 설정하여 업데이트된 문서의 사후 이미지를 포함합니다.
options = { full_document: 'updateLookup' } stream = collection.watch([], options) stream.each do |doc| puts doc break if doc['operationType'] == 'invalidate' end
변경 스트림 애플리케이션 이 별도의 shell 에서 실행 되는 경우 앞의 업데이트 예시 를 사용하여 restaurants 컬렉션 의 문서 를 업데이트하면 다음 출력과 유사한 변경 이벤트 가 출력됩니다.
{"_id"=>{"_data"=>"..."}, "operationType"=>"update", "clusterTime"=> #<...1>, "wallTime"=>..., "fullDocument"=>{"_id"=>BSON::ObjectId('...'), "address"=>{"building"=>"202-24", "coord"=>[-73.9250442, 40.5595462], "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"=>BSON::ObjectId('...')}, "updateDescription"=>{"updatedFields"=> {"cuisine"=>"Irish"}, "removedFields"=>[], "truncatedArrays"=>[]}}
팁
사전 이미지 및 사후 이미지에 대해 자세히 알아보려면 Change Streams 매뉴얼에서 문서 사전 및 사후 이미지로 MongoDB Server 을 참조하세요.
추가 정보
변경 스트림에 대해 자세히 알아보려면 Change Streams 매뉴얼의 MongoDB Server 을 참조하세요.
API 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.