replace
事件
在此页面上
总结
replace
当更新操作从集合中删除文档并将其替换为新文档时(例如调用
replaceOne
方法时),会发生replace
事件。
说明
字段 | 类型 | 说明 | |||
---|---|---|---|---|---|
_id | 文档 | 一个 BSON 对象,用作变更流事件的标识符。恢复变更流时,此值用作
有关通过 | |||
clusterTime | 时间戳 | 与事件相关的 oplog 条目中的时间戳。 与多文档事务相关的变更流事件通知都具有相同的 在分片集群上,具有相同 要标识单个事务的事件,您可以在变更流事件文档中结合使用 | |||
collectionUUID | UUID | 标识发生更改的集合的 UUID。 6.0 版本中的新功能。 | |||
documentKey | 文档 | 一个文档,其中包含 CRUD 操作创建或修改的文档的 对于分片集合,此字段还显示文档的完整分片键。如果 | |||
fullDocument | 文档 | 该操作创建的新文档。 在 6.0 版本中进行了更改。 从 MongoDB 6.0 开始,如果您使用 | |||
fullDocumentBeforeChange | 文档 | 操作应用更改之前的文档。即文档前像。 当您使用 6.0 版本中的新功能。 | |||
lsid | 文档 | 与事务关联的会话标识符。 只有当操作是多文档事务的一部分时才会出现。 | |||
ns | 文档 | 受事件影响的命名空间(数据库和/或集合)。 | |||
ns.coll | 字符串 | 发生事件的集合的名称。 | |||
ns.db | 字符串 | 发生事件的数据库的名称。 | |||
operationType | 字符串 | 变更通知报告的操作类型。 为这些变更事件返回 | |||
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
可使用默认保留策略:将保留前像和后像,直到从 oplog 中删除对应的变更流事件。如果变更流事件从 oplog 中删除,则无论
expireAfterSeconds
前映像和后映像保留时间如何,相应的前映像和后映像也会被删除。
其他考量:
启用前像和后像会占用存储空间并增加处理时间。仅在需要时启用前像和后像。
将变更流事件大小限制为小于 16 MB。要限制事件大小,您可以:
将文档大小限制为 8 MB。如果其他 change stream 事件字段(例如
updateDescription
)不是很大,则可以在 change stream 输出中同时请求更新前的文档和更新后的文档。如果其他变更流事件字段(例如
updateDescription
)并不大,则仅请求变更流输出中最多 16 MB 的文档的后像。在以下情况下,仅请求最大 16 MB 的文档的 change stream 输出中的预映像:
文档更新仅影响文档结构或内容的一小部分,且
不会引起
replace
变更事件。replace
事件始终包含后像。
要请求前图像,请在
db.collection.watch()
中将fullDocumentBeforeChange
设置为required
或whenAvailable
。要请求后图像,您可以使用相同的方法设置fullDocument
。前像被写入
config.system.preimages
集合。config.system.preimages
集合可能会变大。要限制集合大小,可如前文所示为前映像设置expireAfterSeconds
时间。前像由后台进程异步删除。
重要
向后不兼容的功能
从 MongoDB 6.0 开始,如果您将文档前图像和后图像用于 change stream,则必须使用 collMod
命令为每个集合禁用 changeStreamPreAndPostImages,然后才能降级到早期 MongoDB 版本。
示例
以下示例说明了 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
表示插入替换文档后的文档。