文档菜单
文档首页
/
MongoDB 手册
/ /

替换 事件

本页内容

  • 摘要
  • 描述
  • 行为
  • 文档预览和后置图像
  • 示例
replace

当更新操作从一个集合中删除一个文档并用一个新的文档替换它时,如调用replaceOne 方法时,会触发一个 replace 事件。

字段
类型
描述
_id
文档

一个作为更改流事件标识符的 BSON 对象。此值用作恢复更改流时 resumeAfter 参数的 resumeToken。该 _id 对象具有以下形式

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

_data 类型取决于 MongoDB 版本,在某些情况下取决于更改流打开或恢复时的 功能兼容版本 (fCV)。有关 _data 类型的完整列表,请参阅 Resume Tokens

有关通过 resumeToken 恢复更改流的示例,请参阅 Resume a Change Stream

clusterTime
时间戳

clusterTime 是与事件相关的 oplog 条目的时间戳。

由于 oplog 大小限制多文档事务可能创建多个 oplog 条目。在一个事务中,在给定 oplog 条目中安排的更改流事件共享相同的 clusterTime

具有相同 clusterTime 的事件可能并不都与同一事务相关。一些事件根本不与任何事务相关。从 MongoDB 8.0 开始,这种情况可能适用于任何部署的事件。在之前版本中,这种行为仅适用于分片集群中的事件。

要识别单个事务的事件,您可以在更改流事件文档中使用 lsidtxnNumber 的组合。

变更版本8.0.

collectionUUID
UUID

UUID,用于标识发生更改的集合。

版本6.0.

documentKey
document

包含由 CRUD 操作创建或修改的文档的 _id 值的文档。

对于分片集合,此字段还显示文档的完整分片键。如果 _id 字段已经是分片键的一部分,则不会重复。

fullDocument
document

由操作创建的新文档。

变更版本6.0.

从 MongoDB 6.0 开始,如果您使用 db.createCollection()createcollMod 设置 changeStreamPreAndPostImages 选项,则 fullDocument 字段显示插入、替换或更新(文档后像)后的文档。对于 insert 事件,始终包含 fullDocument

fullDocumentBeforeChange
document

在操作应用更改之前,文档的状态。即文档前像。

当您使用 db.createCollection() 方法或 createcollMod 命令启用集合的 changeStreamPreAndPostImages 字段时,此字段可用。

版本6.0.

lsid
document

与事务关联的会话的标识符。

仅当操作是 多文档事务 的一部分时才存在。

ns
document

受事件影响的名字空间(数据库和/或集合)。

ns.coll
string

事件发生的集合的名称。

ns.db
string

事件发生的数据库的名称。

operationType
string

更改通知报告的操作类型。

对于这些更改事件,返回值是 replace

txnNumber
NumberLong

lsid 结合,这是一个帮助唯一标识事务的数字。

仅当操作是 多文档事务 的一部分时才存在。

wallTime

数据库操作的数据库服务器日期和时间。与 clusterTime 不同,clusterTime 是从与数据库操作事件关联的操作日志条目中获取的时间戳。

版本6.0.

从MongoDB 6.0开始,如果你执行以下步骤,将看到一个带有文档更改(或删除)之前字段的 fullDocumentBeforeChange 文档

  1. 使用 db.createCollection()createcollMod 为集合启用新的 changeStreamPreAndPostImages 字段。

  2. db.collection.watch() 中将 fullDocumentBeforeChange 设置为 "required""whenAvailable"

变更流输出中的示例 fullDocumentBeforeChange 文档

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

有关包含变更流输出的完整示例,请参阅 带有文档预览和后览图像的变更流。

如果图像是在文档更新或删除操作时未启用,则 变更流事件 中不可用预览和后览图像

  • 在文档更新或删除操作时未在集合上启用。

  • expireAfterSeconds 中设置保留时间后已删除。

    • 以下示例在整个集群上设置 expireAfterSeconds100

      use admin
      db.runCommand( {
      setClusterParameter:
      { changeStreamOptions: {
      preAndPostImages: { expireAfterSeconds: 100 }
      } }
      } )
    • 以下示例返回当前的 changeStreamOptions 设置,包括 expireAfterSeconds

      db.adminCommand( { getClusterParameter: "changeStreamOptions" } )
    • expireAfterSeconds 设置为 off 将使用默认的保留策略:预映像和后映像将保留,直到相应的更改流事件从 操作日志 中移除。

    • 如果从操作日志中移除更改流事件,则相应的预映像和后映像也将被删除,无论 expireAfterSeconds 的预映像和后映像保留时间如何。

其他考虑因素

  • 启用预映像和后映像会消耗存储空间并增加处理时间。只有需要时才启用预映像和后映像。

  • 将更改流事件的大小限制在小于16兆字节。要限制事件大小,您可以

    • 将文档大小限制在8兆字节。如果其他更改流事件字段(如 updateDescription)不大,则可以在 更改流输出 中同时请求预映像和后映像。

    • 如果其他更改流事件字段(如 updateDescription)不大,则对16兆字节以下的文档在更改流输出中仅请求后映像。

    • 如果

      • 文档更新仅影响文档结构或内容的一小部分,并且

      • 不会导致 replace 更改事件。替换事件始终包括后映像。

  • 要请求预映像,您可以在 db.collection.watch() 中将 fullDocumentBeforeChange 设置为 requiredwhenAvailable。要请求后映像,您可以使用相同的方法设置 fullDocument

  • 预映像写入到 config.system.preimages 集合。

    • config.system.preimages 集合可能会变得很大。要限制集合大小,您可以设置如前所述的预映像的 expireAfterSeconds 时间。

    • 预映像将通过后台进程异步删除。

重要

向后不兼容的功能

从MongoDB 6.0开始,如果您正在使用文档预映像和后映像进行 更改流,则必须在降级到更早的MongoDB版本之前,使用 changeStreamPreAndPostImages 命令禁用每个集合的更改流预映像和后映像。

提示

另请参阅

以下示例说明了 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"
}
}

replace 操作使用更新命令,分为两个阶段

  • 使用 documentKey 删除原始文档

  • 使用相同的 documentKey 插入新文档

replace 事件的 fullDocument 表示替换文档插入后的文档。

返回

重命名