Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs 菜单
Docs 主页
/ /

replace 事件

replace

replace 事件发生时,操作将文档中的所有字段替换为新值,例如调用 replaceOne 时或 update 命令执行文档替换时。

字段
类型
说明

_id

文档

一个BSON对象,用作变更流事件的标识符。恢复变更流时,此值用作 resumeAfter 参数的 resumeToken_id对象中的字段取决于MongoDB版本,在某些情况下,还取决于变更流打开或恢复时的特征兼容性版本(FCV)

有关通过 resumeToken 恢复变更流的示例,请参阅恢复变更流

clusterTime

时间戳

clusterTime 是来自与该事件关联的oplog条目的时间戳。

由于oplog大小限制,多文档事务可能会创建多个oplog条目。在ACID 事务中,给定oplog条目中暂存的变更流事件股票相同的 clusterTime

具有相同clusterTime的事件可能并不都与同一ACID 事务相关。 有些事件与ACID 事务完全无关。 从MongoDB 8.0开始,任何部署上的事件都可能如此。 在以前的版本中,这种行为只适用于分分片集群上的事件。

要标识单个事务的事件,您可以在变更流事件文档中结合使用 lsidtxnNumber

在版本8.0中进行了更改

collectionUUID

UUID

标识发生更改的集合的 UUID

6.0 版本中的新功能

在MongoDB 8.2.0 中,即使您未设立showExpandedEventscollectionUUIDupdateDescription.disambiguatedPaths 也会包含在适用的更改事件中。在 8.2.0 之前的MongoDB版本和 8 版本中。2。1在更高版本中,仅当您使用 showExpandedEvents: true 打开变更流时才包含这些字段。

documentKey

文档

一个文档,其中包含 CRUD 操作创建或修改的文档的 _id 值。

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

fullDocument

文档

该操作创建的新文档。

在 6.0 版本中进行了更改

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

fullDocumentBeforeChange

文档

操作应用更改之前的文档。即文档前像。

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

6.0 版本中的新功能

lsid

文档

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

只有当操作是多文档事务的一部分时才会出现。

ns

文档

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

ns.coll

字符串

发生事件的集合的名称。

ns.db

字符串

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

operationType

字符串

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

为这些变更事件返回 replace 值。

txnNumber

NumberLong

lsid 一起使用的数字,有助于唯一标识事务。

只有当操作是多文档事务的一部分时才会出现。

wallTime

数据库操作的服务器日期和时间。wallTimeclusterTime 的不同之处在于,clusterTime 是从与数据库操作事件相关的 oplog 条目中提取的时间戳。

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 中设置的前像和后像保留时间后之后被删除。

    • 以下示例将整个集群上的 expireAfterSeconds 设置为 100 秒:

      use admin
      db.runCommand( {
      setClusterParameter:
      { changeStreamOptions: {
      preAndPostImages: { expireAfterSeconds: 100 }
      } }
      } )

      注意

      MongoDB Atlas集群不支持setClusterParameter命令。有关Atlas支持所有命令的信息,请参阅 Atlas不支持的命令。

    • 以下示例返回当前的 changeStreamOptions 设置,包括 expireAfterSeconds

      db.adminCommand( { getClusterParameter: "changeStreamOptions" } )
    • expireAfterSeconds 设置为 off 可使用默认保留策略:将保留前像和后像,直到从 oplog 中删除对应的变更流事件。

    • 如果变更流事件从 oplog 中删除,则无论 expireAfterSeconds 前映像和后映像保留时间如何,相应的前映像和后映像也会被删除。

其他考量:

  • 启用前像和后像会占用存储空间并增加处理时间。仅在需要时启用前像和后像。

  • 将变更流事件大小限制为小于 16 MiB。要限制事件大小,您可以:

    • 将文档大小限制为 8 MB。如果其他 change stream 事件字段(例如 updateDescription)不是很大,则可以在 change stream 输出中同时请求更新前的文档和更新后的文档。

    • 如果其他变更流事件字段(例如 updateDescription)并不大,则仅请求变更流输出中最多 16 MiB 的文档的后像。

    • 在以下情况下,仅请求变更流输出中最多 16 MiB 的文档的前像:

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

      • 不会引起 replace 变更事件。replace 事件始终包含后像。

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

  • 前像被写入 config.system.preimages 集合。

    • config.system.preimages 集合可能会变大。要限制集合大小,可如前文所示为前映像设置 expireAfterSeconds 时间。

    • 要监控config.system.preimages 的大小,请连接到分片集群上的分片节点或副本集上的mongod 节点。然后,运行以下命令:

      use config
      db.system.preimages.totalSize()
      db.system.preimages.stats()
    • 前像由后台进程异步删除。

重要

向后不兼容的功能

从 MongoDB 6.0 开始,如果您将文档前图像和后图像用于 change stream,则必须使用 collMod 命令为每个集合禁用 changeStreamPreAndPostImages,然后才能降级到早期 MongoDB 版本。

提示

update 命令可以根据它对集合所做的实际更改生成不同的更改事件(而不仅仅是 update)。

ChangeEvent
说明

更新操作修改了现有文档。

更新操作替换了文档或生成了比原始文档更详细的差异,从而导致MongoDB替换了该文档。

更新操作尝试更新不存在的文档,而是将该文档添加到集合中。仅当更新在启用 upsert 选项的情况下运行时才会出现这种情况。

以下示例说明了 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事件可以由执行全文档替换的 replaceOne()update 命令引起。

replace事件的 fullDocument 表示操作完成后的替换文档。

后退

改名

在此页面上