Database Manual / Change Streams / Change Events

replace Event事件

Summary摘要

replace
A replace event occurs when an update operation removes a document from a collection and replaces it with a new document, such as when the replaceOne method is called.当更新操作从集合中删除文档并用新文档替换它时,会发生replace事件,例如调用replaceOne方法时。

Description描述

Field字段Type类型Description描述
_idDocument文档

A BSON object which serves as an identifier for the change stream event. This value is used as the resumeToken for the resumeAfter parameter when resuming a change stream. The _id object has the following form:BSON对象,用作更改流事件的标识符。在恢复更改流时,此值用作resumeAfter参数的resumeToken_id对象具有以下形式:

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

The _data type depends on the MongoDB versions and, in some cases, the feature compatibility version (FCV) at the time of the change stream's opening or resumption. See Resume Tokens for the full list of _data types._data类型取决于MongoDB版本,在某些情况下,还取决于更改流打开或恢复时的功能兼容性版本(FCV)。有关_data类型的完整列表,请参阅恢复令牌

For an example of resuming a change stream by resumeToken, see Resume a Change Stream.有关通过resumeToken恢复更改流的示例,请参阅恢复更改流

clusterTimeTimestamp

clusterTime is the timestamp from the oplog entry associated with the event.是与事件关联的oplog条目的时间戳。

Due to oplog size limits, multi-document transactions may create multiple oplog entries. In a transaction, change stream events staged in a given oplog entry share the same clusterTime.由于oplog大小的限制多文档事务可能会创建多个oplog条目。在事务中,给定oplog条目的变更流事件共享相同的clusterTime

Events with the same clusterTime may not all relate to the same transaction. 具有相同clusterTime的事件可能并不都与同一事务相关。Some events don't relate to a transaction at all. Starting in MongoDB 8.0, this may be true for events on any deployment. 有些事件根本与事务无关。从MongoDB 8.0开始,这可能适用于任何部署上的事件。In previous versions, this behavior was possible only for events on a sharded cluster.在以前的版本中,这种行为仅适用于分片集群上的事件。

To identify events for a single transaction, you can use the combination of lsid and txnNumber in the change stream event document.要识别单个事务的事件,可以在更改流事件文档中使用lsidtxnNumber的组合。

Changed in version 8.0.在版本8.0中的更改。

collectionUUIDUUID

UUID identifying the collection where the change occurred.标识发生更改的集合的UUID。

New in version 6.0.在版本6.0中新增。

The collectionUUID field is only included if the change stream is created with the showExpandedEvents field set to true. For details, see showExpandedEvents.只有在创建更改流时将showExpandedEvents字段设置为true时,才会包含collectionUUID字段。有关详细信息,请参阅showExpandedEvents

documentKeydocument文档

Document that contains the _id value of the document created or modified by the CRUD operation.包含通过CRUD操作创建或修改的文档的_id值的文档。

For sharded collections, this field also displays the full shard key for the document. The _id field is not repeated if it is already a part of the shard key.对于分片集合,此字段还显示文档的完整分片键。如果_id字段已经是分片键的一部分,则不会重复。

fullDocumentdocument文档The new document created by the operation.操作创建的新文档。

Changed in version 6.0.在版本6.0中的更改。

Starting in MongoDB 6.0, if you set the changeStreamPreAndPostImages option using db.createCollection(), create, or collMod, then the fullDocument field shows the document after it was inserted, replaced, or updated (the document post-image). 从MongoDB 6.0开始,如果使用db.createCollection()createcollMod设置changeStreamPreAndPostImages选项,则fullDocument字段将显示插入、替换或更新后的文档(文档后映像)。fullDocument is always included for insert events.始终包含在insert事件中。

fullDocumentBeforeChangedocument文档

The document before changes were applied by the operation. That is, the document pre-image.操作应用了更改前的文档。即文档预映像。

This field is available when you enable the changeStreamPreAndPostImages field for a collection using db.createCollection() method or the create or collMod commands.当您使用db.createCollection()方法或createcollMod命令为集合启用changeStreamPreAndPostImages字段时,此字段可用。

New in version 6.0.在版本6.0中新增。

lsiddocument文档

The identifier for the session associated with the transaction.与事务关联的会话的标识符。

Only present if the operation is part of a multi-document transaction.仅当操作是多文档事务的一部分时才存在。

nsdocument文档

The namespace (database and or collection) affected by the event.受事件影响的命名空间(数据库和/或集合)。

ns.collstring字符串

The name of the collection where the event occurred.发生事件的集合的名称。

ns.dbstring字符串

The name of the database where the event occurred.发生事件的数据库的名称。

operationTypestring字符串

The type of operation that the change notification reports.更改通知报告的操作类型。

Returns a value of replace for these change events.返回这些更改事件的replace值。

txnNumberNumberLong

Together with the lsid, a number that helps uniquely identify a transction.lsid一起,一个有助于唯一标识事务的数字。

Only present if the operation is part of a multi-document transaction.仅当操作是多文档事务的一部分时才存在。

wallTimeISODate

The server date and time of the database operation. wallTime differs from clusterTime in that clusterTime is a timestamp taken from the oplog entry associated with the database operation event.数据库操作的服务器日期和时间。wallTimeclusterTime的不同之处在于,clusterTime是从与数据库操作事件关联的oplog条目中获取的时间戳。

New in version 6.0.在版本6.0中新增。

Behavior行为

Document Pre- and Post-Images文档前映像和后映像

Starting in MongoDB 6.0, you see a fullDocumentBeforeChange document with the fields before the document was changed (or deleted) if you perform these steps:从MongoDB 6.0开始,如果执行以下步骤,您将看到一个fullDocumentBeforeChange文档,其中包含更改(或删除)文档之前的字段:

  1. Enable the new changeStreamPreAndPostImages field for a collection using db.createCollection(), create, or collMod.使用db.createCollection()createcollMod为集合启用新的changeStreamPreAndPostImages字段。
  2. Set fullDocumentBeforeChange to "required" or "whenAvailable" in db.collection.watch().db.collection.watch()中将fullDocumentBeforeChange设置为"required""whenAvailable"

Example fullDocumentBeforeChange document in the change stream output:更改流输出中的示例fullDocumentBeforeChange文档:

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

For complete examples with the change stream output, see Change Streams with Document Pre- and Post-Images.有关更改流输出的完整示例,请参阅使用文档前后图像更改流

Pre- and post-images are not available for a change stream event if the images were:如果图像存在以下情况,则前映像和后映像对更改流事件不要用:

  • Not enabled on the collection at the time of a document update or delete operation.在文档更新或删除操作时,集合上未启用。
  • Removed after the pre- and post-image retention time set in expireAfterSeconds.expireAfterSeconds中设置的图像保留时间前后删除。

    • The following example sets expireAfterSeconds to 100 seconds on an entire cluster:以下示例将整个集群上的expireAfterSeconds设置为100秒:

      use admin
      db.runCommand( {
      setClusterParameter:
      { changeStreamOptions: {
      preAndPostImages: { expireAfterSeconds: 100 }
      } }
      } )
    • The following example returns the current changeStreamOptions settings, including expireAfterSeconds:以下示例返回当前changeStreamOptions设置,包括expireAfterSeconds

      db.adminCommand( { getClusterParameter: "changeStreamOptions" } )
    • Setting expireAfterSeconds to off uses the default retention policy: pre- and post-images are retained until the corresponding change stream events are removed from the oplog.expireAfterSeconds设置为off将使用默认保留策略:保留前后映像,直到从oplog中删除相应的更改流事件。
    • If a change stream event is removed from the oplog, then the corresponding pre- and post-images are also deleted regardless of the expireAfterSeconds pre- and post-image retention time.如果从oplog中删除了更改流事件,则相应的预映像和后映像也将被删除,而不管映像保留时间为expireAfterSeconds之前和之后。

Additional considerations:其他注意事项:

  • Enabling pre- and post-images consumes storage space and adds processing time. Only enable pre- and post-images if you need them.启用预映像和后映像会消耗存储空间并增加处理时间。仅在需要时启用前置和后置图像。
  • Limit the change stream event size to less than 16 mebibytes. To limit the event size, you can:将更改流事件大小限制为小于16兆字节。要限制事件大小,您可以:

    • Limit the document size to 8 megabytes. You can request pre- and post-images simultaneously in the change stream output if other change stream event fields like updateDescription are not large.将文档大小限制为8 MB。如果其他更改流事件字段(如updateDescription)不大,您可以在更改流输出中同时请求前映像和后映像。
    • Request only post-images in the change stream output for documents up to 16 mebibytes if other change stream event fields like updateDescription are not large.如果其他更改流事件字段(如updateDescription)不大,则仅请求更改流输出中最多16兆字节的文档的后映像。
    • Request only pre-images in the change stream output for documents up to 16 mebibytes if:在以下情况下,仅在更改流输出中请求最多16兆字节的文档的前映像:

      • document updates affect only a small fraction of the document structure or content, and文档更新仅影响文档结构或内容的一小部分,以及
      • do not cause a replace change event. A replace event always includes the post-image.不要引起replace事件。replace事件总是包括后映像。
  • To request a pre-image, you set fullDocumentBeforeChange to required or whenAvailable in db.collection.watch(). To request a post-image, you set fullDocument using the same method.要请求预映像,您可以在db.collection.watch()中将fullDocumentBeforeChange设置为requiredwhenAvailable。要请求后映像,您可以使用相同的方法设置fullDocument
  • Pre-images are written to the config.system.preimages collection.预映像会写入config.system.preimages集合。

    • The config.system.preimages collection may become large. To limit the collection size, you can set expireAfterSeconds time for the pre-images as shown earlier.config.system.preimages集合可能会变大。要限制集合大小,您可以为预映像设置expireAfterSeconds时间,如前所示。
    • Pre-images are removed asynchronously by a background process.前图像由后台进程异步删除。

Important

Backward-Incompatible Feature向后不兼容功能

Starting in MongoDB 6.0, if you are using document pre- and post-images for change streams, you must disable changeStreamPreAndPostImages for each collection using the collMod command before you can downgrade to an earlier MongoDB version.从MongoDB 6.0开始,如果您将文档前映像和后映像用于更改流,则必须使用collMod命令为每个集合禁用changeStreamPreAndPostImages,然后才能降级到早期的MongoDB版本。

Tip

Update Operations更新操作

The update command can produce different change events (not just update) depending on the actual changes it makes to the collection.update命令可以根据它对集合所做的实际更改产生不同的更改事件(而不仅仅是update)。

Change Event更改事件Description描述
updateThe update operation modified an existing document.更新操作修改了现有文档。
replaceThe update operation replaced the document or produced a diff that was more verbose than the original document, causing MongoDB to replace it.更新操作替换了文档或产生了比原始文档更详细的差异,导致MongoDB替换它。
insertThe update operation attempted to update a document that doesn't exist and instead added the document to the collection. This only occurs when the update runs with the upsert option enabled.更新操作试图更新一个不存在的文档,而是将该文档添加到集合中。仅当更新在启用upsert选项的情况下运行时才会发生这种情况。

Examples示例

The following example illustrates a replace event:以下示例说明了replace事件:

{
"_id": { <Resume Token> },
"operationType": "replace",
"clusterTime": <Timestamp>,
"wallTime": <ISODate>,
"ns": {
"db": "engineering",
"coll": "users"
},
"documentKey": {
"_id": ObjectId("599af247bb69cd89961c986d")
},
"fullDocument": {
"_id": ObjectId("599af247bb69cd89961c986d"),
"userName": "alice123",
"name": "Alice"
}
}

A replace operation uses the update command, and consists of two stages:replace操作使用update命令,分为两个阶段:

  • Delete the original document with the documentKey and使用documentKey和删除原始文档
  • Insert the new document using the same documentKey使用相同的documentKey插入新文档

The fullDocument of a replace event represents the document after the insert of the replacement document.replace事件的fullDocument表示插入替换文档后的文档。