替换 事件
摘要
replace当更新操作从一个集合中删除一个文档并用一个新的文档替换它时,如调用
replaceOne方法时,会触发一个replace事件。
描述
字段 | 类型 | 描述 | |||
|---|---|---|---|---|---|
_id | 文档 | 一个作为更改流事件标识符的 BSON 对象。此值用作恢复更改流时
有关通过 | |||
clusterTime | 时间戳 |
由于 oplog 大小限制,多文档事务可能创建多个 oplog 条目。在一个事务中,在给定 oplog 条目中安排的更改流事件共享相同的 具有相同 要识别单个事务的事件,您可以在更改流事件文档中使用 变更版本8.0. | |||
collectionUUID | UUID | UUID,用于标识发生更改的集合。 新版本6.0. | |||
documentKey | document | 包含由 CRUD 操作创建或修改的文档的 对于分片集合,此字段还显示文档的完整分片键。如果 | |||
fullDocument | document | 由操作创建的新文档。 变更版本6.0. 从 MongoDB 6.0 开始,如果您使用 | |||
fullDocumentBeforeChange | document | 在操作应用更改之前,文档的状态。即文档前像。 当您使用 新版本6.0. | |||
lsid | document | 与事务关联的会话的标识符。 仅当操作是 多文档事务 的一部分时才存在。 | |||
ns | document | 受事件影响的名字空间(数据库和/或集合)。 | |||
ns.coll | string | 事件发生的集合的名称。 | |||
ns.db | string | 事件发生的数据库的名称。 | |||
operationType | string | 更改通知报告的操作类型。 对于这些更改事件,返回值是 | |||
txnNumber | NumberLong | ||||
wallTime | 数据库操作的数据库服务器日期和时间。与 新版本6.0. |
行为
文档的预览和后览图像
从MongoDB 6.0开始,如果你执行以下步骤,将看到一个带有文档更改(或删除)之前字段的 fullDocumentBeforeChange 文档
使用
db.createCollection()、create或collMod为集合启用新的changeStreamPreAndPostImages字段。在
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 } } } } ) 以下示例返回当前的
changeStreamOptions设置,包括expireAfterSecondsdb.adminCommand( { getClusterParameter: "changeStreamOptions" } ) 将
expireAfterSeconds设置为off将使用默认的保留策略:预映像和后映像将保留,直到相应的更改流事件从 操作日志 中移除。如果从操作日志中移除更改流事件,则相应的预映像和后映像也将被删除,无论
expireAfterSeconds的预映像和后映像保留时间如何。
其他考虑因素
启用预映像和后映像会消耗存储空间并增加处理时间。只有需要时才启用预映像和后映像。
将更改流事件的大小限制在小于16兆字节。要限制事件大小,您可以
将文档大小限制在8兆字节。如果其他更改流事件字段(如
updateDescription)不大,则可以在 更改流输出 中同时请求预映像和后映像。如果其他更改流事件字段(如
updateDescription)不大,则对16兆字节以下的文档在更改流输出中仅请求后映像。如果
文档更新仅影响文档结构或内容的一小部分,并且
不会导致
replace更改事件。替换事件始终包括后映像。
要请求预映像,您可以在
db.collection.watch()中将fullDocumentBeforeChange设置为required或whenAvailable。要请求后映像,您可以使用相同的方法设置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 表示替换文档插入后的文档。