$changeStreamSplitLargeEvent (집계)
정의
MongoDB 7.0(및 6.0.9)의 새로운 기능
변경 스트림 에 16 MB를 초과하는 대규모 이벤트가 있는 경우 BSONObjectTooLarge
예외가 반환됩니다. MongoDB 7.0 (및 6.0.9)부터는 $changeStreamSplitLargeEvent
단계를 사용하여 이벤트를 더 작은 조각으로 분할 할 수 있습니다.
꼭 필요한 경우에만 $changeStreamSplitLargeEvent
를 사용해야 합니다. 예를 들어, 애플리케이션에 전체 문서 사전 또는 사후 이미지가 필요하고 16MB를 초과하는 큰 이벤트를 생성하는 경우, $changeStreamSplitLargeEvent
를 사용합니다.
$changeStreamSplitLargeEvent
사용하기로 결정하기 전에 먼저 변경 이벤트 크기를 줄여야 합니다. 예를 예시 다음과 같습니다.
애플리케이션에 사전 또는 사후 이미지가 필요하지 않는 한 문서 사전 또는 사후 이미지를 요청하지 마세요. 이렇게 하면
fullDocument
및fullDocumentBeforeChange
필드가 더 많이 생성되며, 이는 일반적으로 변경 이벤트에서 가장 큰 객체입니다.애플리케이션에 필요한 필드만 포함하려면
$project
단계를 사용합니다. 이렇게 하면 변경 이벤트 크기가 줄어들고 큰 이벤트를 여러 조각으로 분할하는 데 추가 시간이 걸리지 않습니다. 이렇게 하면 각 배치에서 더 많은 변경 이벤트를 반환할 수 있습니다.
파이프라인에는 $changeStreamSplitLargeEvent
단계를 하나만 가질 수 있으며, 이 단계는 반드시 마지막 단계여야 합니다. $changeStream
파이프라인에서는 $changeStreamSplitLargeEvent
만 사용할 수 있습니다.
$changeStreamSplitLargeEvent
구문:
{ $changeStreamSplitLargeEvent: {} }
행동
$changeStreamSplitLargeEvent
16 MB를 초과하는 이벤트를 프래그먼트로 분할하고 변경 스트림 커서 를 사용하여 프래그먼트를 순차적으로 반환합니다.
프래그먼트는 첫 번째 프래그먼트에서 최대 개수의 필드가 반환되도록 분할 됩니다. 이렇게 하면 이벤트 컨텍스트가 가능한 한 빨리 반환됩니다.
변경 이벤트가 분할되면 최상위 필드 크기만 사용됩니다. $changeStreamSplitLargeEvent
는 하위 문서를 반복적으로 처리하거나 분할하지 않습니다. 예를 들어 $project
단계를 사용하여 크기가 20 MB인 단일 필드가 있는 변경 이벤트를 생성하는 경우 이벤트가 분할되지 않고 단계에서 오류를 반환합니다.
각 조각에는 재개 토큰이 있습니다. 조각의 토큰을 사용하여 스트림이 재개되면 다음 중 하나를 수행합니다.
후속 프래그먼트에서 새 스트림 을 시작합니다.
시퀀스의 마지막 조각에서 재개하는 경우 다음 이벤트부터 시작합니다.
이벤트 의 각 프래그먼트에는 splitEvent
문서 가 포함됩니다.
splitEvent: { fragment: <int>, of: <int> }
다음 표에서는 필드에 대해 설명합니다.
필드 | 설명 |
---|---|
fragment | 1 에서 시작하는 프래그먼트 인덱스 입니다. |
of | 이벤트에 대한 총 조각 수입니다. |
예시
이 섹션의 예시 시나리오에서는 myCollection
이라는 새 컬렉션 과 함께 $changeStreamSplitLargeEvent
을 사용하는 방법을 보여 줍니다.
myCollection
을 만들고 데이터가 16 MB 미만인 문서 하나를 삽입합니다.
db.myCollection.insertOne( { _id: 0, largeField: "a".repeat( 16 * 1024 * 1024 - 1024 ) } )
largeField
반복되는 문자 a
을 포함합니다.
myCollection
에 changeStreamPreAndPostImages를 활성화하면 변경 스트림이 업데이트 전(사전 이미지)과 업데이트 후(사후 이미지)의 문서를 검색할 수 있습니다.
db.runCommand( { collMod: "myCollection", changeStreamPreAndPostImages: { enabled: true } } )
변경 스트림 커서 를 생성하여 db.collection.watch()
을 사용하여 myCollection
에 대한 변경 사항을 모니터 합니다.
myChangeStreamCursor = db.myCollection.watch( [ { $changeStreamSplitLargeEvent: {} } ], { fullDocument: "required", fullDocumentBeforeChange: "required" } )
변경 스트림 이벤트의 경우:
fullDocument: "required"
문서 포스트 이미지가 포함됩니다.fullDocumentBeforeChange: "required"
는 문서 사전 이미지를 포함합니다.
자세한 내용은 $changeStream
를 참조하세요.
myCollection
에서 문서 를 업데이트하면 문서 사전 및 사후 이미지로 변경 스트림 이벤트 도 생성됩니다.
db.myCollection.updateOne( { _id: 0 }, { $set: { largeField: "b".repeat( 16 * 1024 * 1024 - 1024 ) } } )
largeField
이제 반복되는 문자 b
을 포함합니다.
next()
메서드를 사용하여 myChangeStreamCursor
에서 조각을 검색하고 firstFragment
, secondFragment
및 thirdFragment
라는 객체에 조각을 저장합니다.
const firstFragment = myChangeStreamCursor.next() const secondFragment = myChangeStreamCursor.next() const thirdFragment = myChangeStreamCursor.next()
firstFragment.splitEvent
표시:
firstFragment.splitEvent
프래그먼트 세부 정보가 포함된 출력:
splitEvent: { fragment: 1, of: 3 }
마찬가지로 secondFragment.splitEvent
및 thirdFragment.splitEvent
는 다음을 반환합니다.
splitEvent: { fragment: 2, of: 3 } splitEvent: { fragment: 3, of: 3 }
firstFragment
에 대한 객체 키를 검사하려면 다음을 수행합니다.
Object.keys( firstFragment )
출력:
[ '_id', 'splitEvent', 'wallTime', 'clusterTime', 'operationType', 'documentKey', 'ns', 'fullDocument' ]
firstFragment.fullDocument
의 크기를 바이트 단위로 검사하려면 다음을 수행합니다.
bsonsize( firstFragment.fullDocument )
출력:
16776223
secondFragment
에는 크기가 약 16MB인 fullDocumentBeforeChange
사전 이미지가 포함되어 있습니다. 다음 예는 secondFragment
에 대한 객체 키를 보여줍니다.
Object.keys( secondFragment )
출력:
[ '_id', 'splitEvent', 'fullDocumentBeforeChange' ]
thirdFragment
약 16MB 크기의 updateDescription
필드를 포함합니다. 다음 예는 thirdFragment
에 대한 객체 키를 보여줍니다.
Object.keys( thirdFragment )
출력:
[ '_id', 'splitEvent', 'updateDescription' ]
change stream 및 이벤트에 대한 자세한 내용은 변경 이벤트를 참조하세요.