문서 메뉴

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

update 이벤트

이 페이지의 내용

  • 요약
  • 설명
  • 행동
  • 이미지 사전 및 사후 문서화
  • 경로 혼동
  • 예제
update

작업이 컬렉션의 문서를 업데이트하면 update 이벤트가 발생합니다.

참고

명확화

컬렉션 옵션이 수정될 때 발생하는 이벤트에 대해 자세히 알아보려면 modify 이벤트를 참조하세요.

필드
유형
설명
_id
문서

변경 스트림 이벤트의 식별자 역할을 하는 BSON 객체입니다. 이 값은 변경 스트림을 재개할 때 resumeAfter 매개변수의 resumeToken(으)로 사용됩니다. _id 개체의 형식은 다음과 같습니다.

{
"_data" : <BinData|hex string>
}

_data 유형은 MongoDB 버전 및 경우에 따라 변경 스트림 열기 또는 재개 시점의 기능 호환성 버전(FCV) 에 따라 달라집니다. _data 유형의 전체 목록은 재개 토큰 을 참조하세요.

resumeToken 기준으로 변경 스트림을 재개하는 예제는 변경 스트림 재개를 참조하세요.

clusterTime
타임스탬프

이벤트와 연결된 oplog 항목의 타임스탬프입니다.

다중 문서 트랜잭션과 연결된 변경 스트림 이벤트 알림은 모두 동일한 clusterTime 값(트랜잭션이 커밋된 시간)을 가집니다.

샤딩된 클러스터에서는 동일한 clusterTime 이벤트가 모두 동일한 트랜잭션과 관련되지 않을 수 있습니다. 일부 이벤트는 트랜잭션과는 전혀 관련이 없습니다.

단일 트랜잭션에 대한 이벤트를 식별하려면 변경 스트림 이벤트 문서에서 lsidtxnNumber 조합을 사용할 수 있습니다.

버전 4.0에 추가.

collectionUUID
UUID

변경이 발생한 컬렉션을 식별하는 UUID입니다.

버전 6.0에 추가.

documentKey
문서

CRUD 작업으로 만들거나 수정한 문서의 _id 값이 들어 있는 문서입니다.

샤딩된 컬렉션의 경우 이 필드에는 문서의 전체 샤드 키도 표시됩니다. _id 필드가 이미 분할 키의 일부인 경우 반복되지 않습니다.

fullDocument
문서

CRUD 작업에 의해 생성되거나 수정된 문서입니다.

이 필드는 fullDocument 을(를) updateLookup 으)로 설정하여 변경 스트림을 구성한 경우에만 표시됩니다. updateLookup 를 사용하여 변경 스트림을 구성하는 경우 필드는 업데이트 작업으로 수정된 문서의 현재 과반수 커밋 버전을 나타냅니다. 원래의 업데이트 작업과 전체 문서 조회 사이에 다른 다수 커밋 작업이 문서를 수정한 경우 updateDescription 에 설명된 변경 사항과 문서가 상이할 수 있습니다.

자세한 내용은 업데이트 작업을 위한 전체 문서 조회를 참조하세요.

버전 6.0에서 변경되었습니다.

MongoDB 6.0부터 db.createCollection(), create 또는 collMod을(를) 사용하여 changeStreamPreAndPostImages 옵션을 설정하면 fullDocument 필드에 문서가 삽입, 교체 또는 업데이트된 후의 문서(문서 사후 이미지)가 표시됩니다. fullDocument은(는) insert 이벤트에 항상 포함됩니다.

fullDocumentBeforeChange
문서

작업으로 변경 사항이 적용되기 전의 문서입니다. 즉, 문서 사전 이미지입니다.

이 필드는 db.createCollection() 메서드 또는 create 또는 collMod 명령을 사용하여 컬렉션에 대해 changeStreamPreAndPostImages 필드를 활성화할 때 사용할 수 있습니다.

버전 6.0에 추가.

lsid
문서

트랜잭션과 연결된 세션의 식별자입니다.

작업이 다중 문서 트랜잭션의 일부인 경우에만 표시됩니다.

버전 4.0에 추가.

ns
문서

이벤트의 영향을 받는 네임스페이스(데이터베이스 및/또는 컬렉션)입니다.

ns.coll
문자열

이벤트가 발생한 컬렉션의 이름입니다.

ns.db
문자열

이벤트가 발생한 데이터베이스의 이름입니다.

operationType
문자열

변경 알림이 보고하는 작업 유형입니다.

이러한 변경 이벤트에 대해 update 값을 반환합니다.

updateDescription
문서

업데이트 작업으로 업데이트되거나 제거된 필드를 설명하는 문서입니다.

updateDescription.
disambiguatedPaths
문서

updateDescription 의 모호한 필드 설명자를 명확하게 설명하는 문서입니다.

update 0} 변경 이벤트가 경로에 마침표(.)가 포함되어 있거나 경로에 배열이 아닌 숫자 disambiguatedPath 하위 필드가 포함된 필드의 변경 사항을 설명하는 경우, 필드는 수정된 필드의 경로에 있는 각 항목을 나열하는 배열을 문서에 제공합니다.

확장된 이벤트 표시 옵션을 true(으)로 설정해야 합니다.

버전 6.1에 추가.

updateDescription.
removedFields
배열

업데이트 작업으로 제거된 필드의 배열입니다.

updateDescription.
truncatedArrays
배열

다음 단계 중 하나 이상을 사용하여 파이프라인 기반 업데이트로 수행한 배열 잘림을 기록하는 문서 배열입니다.

참고

전체 배열이 교체되면 잘린 내용이 updateDescription.updatedFields 아래에 보고됩니다.

updateDescription.
truncatedArrays.
field
문자열

잘린 필드의 이름입니다.

updateDescription.
truncatedArrays.
newSize
integer

잘린 배열 내 요소의 수입니다.

updateDescription.
updatedFields
문서

업데이트 작업으로 수정된 필드에 해당하는 키가 있는 문서입니다. 각 필드의 값은 새 값을 생성한 작업이 아니라 해당 필드의 새 값에 해당합니다.

txnNumber
NumberLong

lsid 와 함께 트랜잭션을 고유하게 식별하는 데 도움이 되는 숫자입니다.

작업이 다중 문서 트랜잭션의 일부인 경우에만 표시됩니다.

버전 4.0에 추가.

wallTime

데이터베이스 작업의 서버 날짜 및 시간입니다. wallTime은(는) clusterTime이(가) 데이터베이스 작업 이벤트와 관련된 oplog 항목에서 가져온 타임스탬프라는 점에서 clusterTime와(과) 다릅니다.

버전 6.0에 추가.

MongoDB 6.0부터 다음 단계를 수행하면 문서가 변경(또는 삭제) 되기 전의 필드가 포함된 fullDocumentBeforeChange 문서가 표시됩니다.

  1. db.createCollection(), create, 또는 collMod을(를) 사용하는 컬렉션에 대해 새 changeStreamPreAndPostImages 필드를 사용하도록 설정합니다.

  2. fullDocumentBeforeChange을(를) "required" 또는 db.collection.watch() 에서 "whenAvailable"(으)로 설정합니다.

변경 스트림 출력의 예제 fullDocumentBeforeChange 문서입니다.

"fullDocumentBeforeChange" : {
"_id" : ObjectId("599af247bb69cd89961c986d"),
"userName" : "alice123",
"name" : "Alice Smith"
}

변경 스트림 출력에 대한 전체 예시는 전후 이미지를 포함하는 문서의 Change Streams를 참조하세요.

이미지가 다음과 같은 경우 change stream 이벤트에 사전 및 사후 이미지를 사용할 수 없습니다.

  • 문서 업데이트 또는 삭제 작업 시 collection에서 활성화되지 않았습니다.

  • expireAfterSeconds에서 전후 이미지 보존 시간 설정 이후에 제거됩니다.

    • 다음 예에서는 전체 cluster에서 expireAfterSeconds100 초로 설정합니다.

      use admin
      db.runCommand( {
      setClusterParameter:
      { changeStreamOptions: { preAndPostImages: { expireAfterSeconds: 100 } } }
      } )
    • 다음 예에서는 특정 collection에서 expireAfterSeconds ~ 100 초를 설정합니다.

      use admin
      db.getSiblingDB("my_collection")
      .sensors.watch({ changeStreamOptions:
      { preAndPostImages: { expireAfterSeconds: 100 } } })
    • 다음 예제에서는 expireAfterSeconds 등 현재 changeStreamOptions 설정을 반환합니다.

      db.adminCommand( { getClusterParameter: "changeStreamOptions" } )
    • expireAfterSecondsoff로 설정하면 기본 보존 정책이 사용되며, 해당 change stream 이벤트가 oplog에서 제거될 때까지 사전 및 사후 이미지가 보존됩니다.

    • change stream 이벤트가 oplog에서 제거되면 expireAfterSeconds 사전 및 사후 이미지 보존 시간에 관계없이 해당 사전 및 사후 이미지도 삭제됩니다.

추가 고려 사항

  • 전후 이미지를 활성화하면 저장 공간이 소모되고 처리 시간이 늘어납니다. 필요한 경우에만 전후 이미지를 활성화하세요.

  • 변경 스트림 이벤트 크기를 16메가바이트 미만으로 제한합니다. 이벤트 크기를 제한하려면 다음을 수행하면 됩니다.

    • 문서 크기를 8메가바이트로 제한합니다. updateDescription과 같은 다른 change stream 이벤트 필드가 크지 않은 경우 change stream 출력에서 사전 및 사후 이미지를 동시에 요청할 수 있습니다.

    • updateDescription과 같은 다른 change stream 이벤트 필드가 크지 않은 경우 최대 16메가바이트 문서에 대해 change stream 출력에서 사후 이미지만 요청합니다.

    • 다음과 같은 경우 최대 16메가바이트의 문서에 대해 change stream 출력에서 사전 이미지만 요청합니다.

      • 문서 업데이트가 문서 구조나 내용의 작은 부분에만 영향을 미칩니다. 그리고

      • replace 변경 이벤트를 발생시키지 않습니다. replace 이벤트에는 항상 후이미지가 포함됩니다.

  • 사전 이미지를 요청하려면 db.collection.watch()에서 fullDocumentBeforeChangerequired 또는 whenAvailable로 설정합니다. 사후 이미지를 요청하려면 동일한 방법으로 fullDocument를 설정합니다.

  • 사전 이미지가 config.system.preimages 컬렉션에 기록됩니다.

    • config.system.preimages collection은 커질 수 있습니다. collection 크기를 제한하려면 앞서 표시된 대로 사전 이미지에 대해 expireAfterSeconds 시간을 설정할 수 있습니다.

    • 사전 이미지는 백그라운드 프로세스가 비동기적으로 제거합니다.

중요

이전 버전과 호환되지 않는 기능

MongoDB 6.0부터는 change stream에 문서 사전 및 사후 이미지를 사용하는 경우 이전 MongoDB 버전으로 다운그레이드하기 전에 collMod 명령을 사용하여 각 collection에 대해 changeStreamPreAndPostImages를 비활성화해야 합니다.

다음도 참조하세요.

버전 6.1에 추가.

updateDescription 필드는 작업으로 인해 문서의 특정 필드에 변경된 내용을 기록합니다. 이러한 필드 설명자는 점(.)을 경로 구분자로 사용하고 숫자를 배열 인덱스로 사용하므로 점이나 숫자를 사용하는 필드 이름이 포함된 경우 모호성이 발생합니다.

update 이벤트가 모호한 disambiguatedPaths 필드와 관련된 변경 사항을 보고하면 문서에서 경로 키에 각 경로 구성 요소를 나열하는 배열을 제공합니다.

참고

disambiguatedPaths 필드는 showExpandedEvents 옵션으로 시작된 변경 스트림에서만 사용할 수 있습니다.

예를 들어, 사람과 그들이 살고 있는 마을을 나열하는 문서를 고려해 보겠습니다.

{
"name": "Anthony Trollope",
"home.town": "Oxford",
"residences": [
{"0": "Oxford"},
{"1": "Sunbury"}
]
}
  • 업데이트에서 home.town 필드를 Oxford에서 London(으)로 수정하면 다음과 같은 업데이트 설명이 생성됩니다.

    "updateDescription": {
    "updatedFields": {
    "home.town": "London"
    },
    "disambiguatedPaths": {
    "home.town": [ "home.town" ]
    }
    }

    home.town 필드에 마침표가 포함되어 있으므로 disambiguatedPaths 필드에는 하나의 값이 있는 배열이 표시되어 town(이)가 home의 하위 필드가 아님을 나타냅니다.

  • 업데이트가 동일한 변경을 위해 residences 배열의 값을 수정하면 다음과 같은 업데이트 설명이 생성됩니다.

    "updateDescription": {
    "updatedFields": {
    "residences.0.0": "London"
    },
    "disambiguatedPaths": { "residences.0.0": [ "residences", 0, "0" ] }
    }

    명확해진 경로에는 배열 인덱스를 나타내는 정수 0 및 중첩된 문서 내의 필드 이름을 나타내는 문자열 "0"(이)가 포함됩니다.

disambiguatedPath 에 숫자 필드가 포함되지 않는 두 가지 경우가 있습니다.

  • 경로의 첫 번째 필드가 숫자 문자열인 경우(즉, 0.name). 첫 번째 필드는 배열 인덱스가 될 수 없으므로 이는 모호하지 않습니다.

  • 숫자 문자열 필드에 선행 0이 있는 경우(예: 0001). 정수는 앞에 0을 가질 수 없으므로 이는 모호하지 않습니다.

다음 예시는 update 이벤트에 대한 설명입니다.

{
"_id": { <Resume Token> },
"operationType": "update",
"clusterTime": <Timestamp>,
"wallTime": <ISODate>,
"ns": {
"db": "engineering",
"coll": "users"
},
"documentKey": {
"_id": ObjectId("58a4eb4a30c75625e00d2820")
},
"updateDescription": {
"updatedFields": {
"email": "alice@10gen.com"
},
"removedFields": ["phoneNumber"],
"truncatedArrays": [ {
"field" : "vacation_time",
"newSize" : 36
} ]
}
}

다음 예시에서는 fullDocument : updateLookup 옵션으로 열린 변경 내역에 대한 update 이벤트를 보여 줍니다.

{
"_id": { <Resume Token> },
"operationType": "update",
"clusterTime": <Timestamp>,
"wallTime": <ISODate>,
"ns": {
"db": "engineering",
"coll": "users"
},
"documentKey": {
"_id": ObjectId("58a4eb4a30c75625e00d2820")
},
"updateDescription": {
"updatedFields": {
"email": "alice@10gen.com"
},
"removedFields": ["phoneNumber"],
"truncatedArrays": [ {
"field" : "vacation_time",
"newSize" : 36
} ],
"disambiguatedPaths": { }
},
"fullDocument": {
"_id": ObjectId("58a4eb4a30c75625e00d2820"),
"name": "Alice",
"userName": "alice123",
"email": "alice@10gen.com",
"team": "replication"
}
}

fullDocument 문서는 업데이트된 문서의 최신 다수 커밋 버전을 나타냅니다. fullDocument 문서는 업데이트 작업과 문서 조회 사이에 발생한 과반수 커밋 작업의 인터리빙 수에 따라 업데이트 작업 당시의 문서와 다를 수 있습니다.

← shardCollection 이벤트