Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

$changeStreamSplitLargeEvent (집계)

이 페이지의 내용

  • 정의
  • 행동
  • 예시
$changeStreamSplitLargeEvent

MongoDB 7.0(및 6.0.9)의 새로운 기능

변경 스트림 에 16 MB를 초과하는 대규모 이벤트가 있는 경우 BSONObjectTooLarge 예외가 반환됩니다. MongoDB 7.0 (및 6.0.9)부터는 $changeStreamSplitLargeEvent 단계를 사용하여 이벤트를 더 작은 조각으로 분할 할 수 있습니다.

꼭 필요한 경우에만 $changeStreamSplitLargeEvent를 사용해야 합니다. 예를 들어, 애플리케이션에 전체 문서 사전 또는 사후 이미지가 필요하고 16MB를 초과하는 큰 이벤트를 생성하는 경우, $changeStreamSplitLargeEvent를 사용합니다.

$changeStreamSplitLargeEvent 사용하기로 결정하기 전에 먼저 변경 이벤트 크기를 줄여야 합니다. 예를 예시 다음과 같습니다.

  • 애플리케이션에 사전 또는 사후 이미지가 필요하지 않는 한 문서 사전 또는 사후 이미지를 요청하지 마세요. 이렇게 하면 fullDocumentfullDocumentBeforeChange 필드가 더 많이 생성되며, 이는 일반적으로 변경 이벤트에서 가장 큰 객체입니다.

  • 애플리케이션에 필요한 필드만 포함하려면 $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 을 포함합니다.

myCollectionchangeStreamPreAndPostImages를 활성화하면 변경 스트림이 업데이트 전(사전 이미지)과 업데이트 후(사후 이미지)의 문서를 검색할 수 있습니다.

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, secondFragmentthirdFragment라는 객체에 조각을 저장합니다.

const firstFragment = myChangeStreamCursor.next()
const secondFragment = myChangeStreamCursor.next()
const thirdFragment = myChangeStreamCursor.next()

firstFragment.splitEvent 표시:

firstFragment.splitEvent

프래그먼트 세부 정보가 포함된 출력:

splitEvent: { fragment: 1, of: 3 }

마찬가지로 secondFragment.splitEventthirdFragment.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 및 이벤트에 대한 자세한 내용은 변경 이벤트를 참조하세요.

돌아가기

$changeStream

이 페이지의 내용