문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

Mongo.watch()

이 페이지의 내용

  • 정의
  • 가용성
  • 배포
  • 스토리지 엔진
  • 읽기 고려 majority 지원
  • 행동
  • 재개 가능성
  • 업데이트 작업의 전체 문서 조회
  • 가용성
  • 액세스 제어
  • 커서 반복
  • 예제
Mongo.watch( pipeline, options )

복제본 세트 및 샤드 클러스터 전용

복제본 세트 또는 샤드 클러스터에 대한 변경 스트림 커서를 열어 admin, localconfig 데이터베이스를 제외한 데이터베이스에서 모든 비system 컬렉션에 대해 보고합니다.

매개변수
유형
설명
pipeline
배열

선택 사항입니다. 다음 집계 단계 중 하나 이상으로 구성된 집계 파이프라인:

변경 이벤트 출력을 필터링/수정할 파이프라인을 지정합니다.

MongoDB 4.2부터 변경 스트림 집계 파이프라인이 이벤트의 _id 필드를 수정하면 변경 스트림이 예외를 스로우합니다.

options
문서
선택 사항. Mongo.watch() 의 동작을 수정하는 추가 옵션입니다.

options 문서에는 다음과 같은 필드 및 값이 포함될 수 있습니다.

필드
유형
설명
resumeAfter
문서

선택 사항. 재개 토큰에 지정된 작업 이후부터 알림 재개를 시도하도록 Mongo.watch() 에 지시합니다.

각 변경 스트림 이벤트 문서에는 _id 필드로 이력서 토큰이 포함되어 있습니다. 이후에 재개하려는 작업을 나타내는 변경 이벤트 문서의 전체 _id 필드를 전달하십시오.

resumeAfter 의 경우 startAfterstartAtOperationTime과 상호 배타적입니다.

startAfter
문서

선택 사항. 재개 토큰에 지정된 작업 후 새 변경 스트림 시작을 시도하도록 Mongo.watch() 에 지시합니다. 무효화 이벤트 후 알림을 다시 시작할 수 있습니다.

각 변경 스트림 이벤트 문서에는 _id 필드로 이력서 토큰이 포함되어 있습니다. 이후에 재개하려는 작업을 나타내는 변경 이벤트 문서의 전체 _id 필드를 전달하십시오.

startAfter 의 경우 resumeAfterstartAtOperationTime과 상호 배타적입니다.

버전 4.2에 추가되었습니다.

fullDocument
문자열

선택 사항. 기본적으로 Mongo.watch() 는 업데이트된 전체 문서 대신 업데이트 작업으로 수정된 필드의 델타를 반환합니다.

fullDocument"updateLookup" 로 설정하여 Mongo.watch() 가 업데이트된 문서의 최신 과반수 커밋 버전을 찾도록 지시합니다. Mongo.watch()updateDescription 델타에 더해 문서 조회가 포함된 fullDocument 필드를 반환합니다.

batchSize
int

선택 사항입니다. MongoDB cluster의 각 응답 배치에서 반환할 최대 변경 이벤트 수를 지정합니다.

cursor.batchSize()와 동일한 기능을 갖습니다.

maxAwaitTimeMS
int

선택 사항입니다. 서버가 빈 배치를 반환하기 전에 변경 스트림 커서에 보고할 새 데이터 변경 내용을 기다리는 최대 시간(밀리초)입니다.

기본값은 1000밀리초입니다.

collation
문서

선택 사항입니다. 데이터 정렬 문서를 전달하여 change stream 커서에 대한 데이터 정렬을 지정합니다.

생략하면 기본값은 simple 바이너리 비교입니다.

startAtOperationTime
타임스탬프

선택 사항입니다. 변경 스트림의 시작 지점입니다. 지정된 시작점이 과거인 경우 oplog의 시간 범위 내에 있어야 합니다. oplog의 시간 범위를 확인하려면 rs.printReplicationInfo()를 참조하십시오.

startAtOperationTime 의 경우 resumeAfterstartAfter과 상호 배타적입니다.

반환합니다:변경 이벤트 문서 위에 커서가 있습니다. 변경 이벤트 문서의 예는 변경 이벤트에서 확인하세요.

다음도 참조하세요.

db.collection.watch() 개인정보 정책에 db.watch()

Mongo.watch() 은(는) 복제본 세트와 샤드 클러스터에 사용할 수 있습니다.

  • 복제본 세트의 경우 모든 데이터 보유 멤버에 대해 Mongo.watch() 를 실행할 수 있습니다.

  • 샤드 클러스터의 Mongo.watch() mongos 경우 인스턴스에서 를 실행해야 합니다.

Wired Tiger 스토리지 엔진 에는 만 Mongo.watch()사용할 수 있습니다.

변경 스트림"majority" 읽기 고려 지원에 관계없이 사용할 수 있습니다. 즉, 읽기 고려 majority 지원을 활성화(기본값)하거나 비활성화 하여 변경 스트림을 사용할 수 있습니다.

  • Mongo.watch() 대부분의 데이터 보유 멤버에게 지속된 데이터 변경 사항에 대해서만 알립니다.

  • 변경 스트림 커서는 다음 중 하나가 발생할 때까지 열려 있습니다.

    • 커서가 명시적으로 닫힙니다.

    • 무효화 이벤트가 발생합니다. 예를 들어 컬렉션 삭제 또는 이름 바꾸기가 있습니다.

    • MongoDB 배포에 대한 연결이 닫히거나 시간 초과됩니다. 자세한 내용은 Cursor Behaviors를 참조하십시오.

    • 배포가 분할된 클러스터인 경우 분할 제거로 인해 열린 변경 스트림 커서가 닫힐 수 있으며 닫힌 변경 스트림 커서가 완전히 재개되지 않을 수 있습니다.

MongoDB 드라이버 와 달리 mongosh 은 오류 발생 후 변경 스트림 커서를 자동으로 재개하려고 시도하지 않습니다. MongoDB 드라이버는 특정 오류 발생 후 변경 스트림 커서를 자동으로 재개하려고 한 번 시도합니다.

Mongo.watch() 는 oplog에 저장된 정보를 사용하여 변경 이벤트 설명을 생성하고 해당 작업과 관련된 재개 토큰을 생성합니다. 재개 토큰으로 식별되어 resumeAfter 또는 startAfter 옵션에 전달된 작업이 이미 oplog 에서 삭제된 경우 Mongo.watch() 는 변경 스트림을 재개할 수 없습니다.

변경 스트림 재개에 대한 자세한 내용은 변경 스트림 재개를 참조하십시오.

참고

  • 무효화 이벤트(예: 컬렉션 삭제 또는 이름 바꾸기)로 인해 스트림이 닫힌 후에는 resumeAfter를 사용하여 변경 스트림을 다시 시작할 수 없습니다. MongoDB 4.2부터는 무효화 이벤트 후 startAfter를 사용하여 새 변경 스트림을 시작할 수 있습니다.

  • 배포가 분할된 클러스터인 경우 분할 제거로 인해 열린 변경 스트림 커서가 닫힐 수 있으며 닫힌 변경 스트림 커서가 완전히 재개되지 않을 수 있습니다.

참고

토큰 재개

재개 토큰 _data 유형은 MongoDB 버전 및 경우에 따라 change stream의 열기/재개 시점의 기능 호환성 버전에 따라 다릅니다. 즉, fcv 값의 변경은 이미 열린 change stream의 재개 토큰에 영향을 주지 않습니다.

MongoDB 버전
기능 호환성 버전
재개 토큰 _data 유형
MongoDB 4.2 이상
"4.2" 또는 "4.0"
16진수 인코딩 문자열(v1)
MongoDB 4.0.7 이상 버전
"4.0" 또는 "3.6"
16진수 인코딩 문자열(v1)
MongoDB 4.0.6 이하 버전
"4.0"
16진수 인코딩 문자열(v0)
MongoDB 4.0.6 이하 버전
"3.6"
BinData
몽고DB 3.6
"3.6"
BinData

16진수로 인코딩된 문자열 재개 토큰을 사용하면 재개 토큰을 비교하고 정렬할 수 있습니다.

fcv 값에 관계없이 4.0 배포에서는 BinData 재개 토큰 또는 16진수 문자열 재개 토큰을 사용하여 change stream을 재개할 수 있습니다. 따라서 4.0 배포에서는 3.6 배포의 컬렉션에서 열린 change stream의 재개 토큰을 사용할 수 있습니다.

MongoDB 버전에 도입된 새로운 재개 토큰 형식은 이전 MongoDB 버전에서 사용할 수 없습니다.

MongoDB는 16진수로 인코딩된 재개 토큰을 mongosh 디코딩하는 확장 " 스니펫 " 을 제공합니다.

재개 토큰 을(를) 설치하고 실행할 수 있습니다. 의 mongosh 스니펫:

snippet install resumetoken
decodeResumeToken('<RESUME TOKEN>')

resumetoken 을 실행할 수도 mongosh 있습니다.npm 시스템에 가 설치되어 있는 경우 명령줄에서 ( 사용하지 않음 ):

npx mongodb-resumetoken-decoder <RESUME TOKEN>

자세한 내용은 다음을 참조하세요.

기본적으로 변경 스트림 커서는 업데이트 작업에 대한 특정 필드 변경 사항/델타를 반환합니다. 또한 변경된 문서의 현재 과반수가 커밋된 버전을 조회하고 반환하도록 변경 스트림을 구성할 수 있습니다. 업데이트와 조회 사이에 발생했을 수 있는 다른 쓰기 작업에 따라 반환된 문서는 업데이트 당시의 문서와 크게 다를 수 있습니다.

업데이트 작업 중에 적용된 변경 사항 수와 전체 문서의 크기에 따라 업데이트 작업에 대한 변경 이벤트 문서의 크기가 16MB BSON 문서 제한보다 클 위험이 있습니다. 이런 일이 발생하면 서버는 변경 스트림 커서를 닫고 오류를 반환합니다.

변경 스트림"majority" 읽기 고려 지원에 관계없이 사용할 수 있습니다. 즉, 읽기 고려 majority 지원을 활성화(기본값)하거나 비활성화 하여 변경 스트림을 사용할 수 있습니다.

액세스 제어를 사용하여 실행하는 경우 사용자는 모든 데이터베이스의 모든 비시스템 컬렉션에 대해 findchangeStream 권한 작업을 수행해야 합니다. 즉, 사용자의 역할이 다음 권한을 부여해야 합니다.

{ resource: { db: "", collection: "" }, actions: [ "find", "changeStream" ] }

기본 제공 read 역할은 적절한 권한을 제공합니다.

MongoDB는 커서를 반복하는 다양한 방법을 제공합니다.

cursor.hasNext() 메서드는 다음 이벤트를 차단하고 기다립니다. watchCursor 커서를 모니터링하고 이벤트를 반복하려면 hasNext()를 다음과 같이 사용합니다.

while (!watchCursor.isClosed()) {
if (watchCursor.hasNext()) {
firstChange = watchCursor.next();
break;
}
}

cursor.tryNext() 메서드는 비차단입니다. watchCursor 커서를 모니터링하고 이벤트를 반복하려면 tryNext()를 다음과 같이 사용합니다.

while (!watchCursor.isClosed()) {
let next = watchCursor.tryNext()
while (next !== null) {
printjson(next);
next = watchCursor.tryNext()
}
}

mongosh 에서 다음 작업은 복제본 세트에서 변경 스트림 커서를 엽니다. 반환된 커서는 admin, localconfig 데이터베이스를 제외한 모든 데이터베이스의system 이외의 모든 컬렉션에 대한 데이터 변경 사항을 보고합니다.

watchCursor = db.getMongo().watch()

커서를 반복하여 새 이벤트를 확인합니다. 2} 메서드를 cursor.isClosed() 메서드와 함께 cursor.tryNext()를 사용하여 변경 스트림 커서가 닫혀 있고 최신 배치에 개체가 남아 있지 않은 경우에만 루프가 종료되도록 합니다:

while (!watchCursor.isClosed()) {
let next = watchCursor.tryNext()
while (next !== null) {
printjson(next);
next = watchCursor.tryNext()
}
}

변경 스트림 출력에 대한 전체 문서는 변경 이벤트를 참조하십시오.

참고

변경 스트림에는 isExhausted()를 사용할 수 없습니다.

← Mongo.setWriteConcern()
Session →