替换
事件
摘要
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
设置,包括expireAfterSeconds
db.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
表示替换文档插入后的文档。