更新 事件
摘要
描述
字段 | 类型 | 描述 | |||
|---|---|---|---|---|---|
_id | 文档 | 一个作为更改流事件标识符的 BSON 对象。此值用作在恢复更改流时
有关通过 | |||
clusterTime | 时间戳 |
由于 oplog 大小限制,多文档事务可能会创建多个 oplog 条目。在一个事务中,在特定 oplog 条目中排练的改变流事件共享相同的 具有相同 要识别单个事务的事件,您可以在改变流事件文档中使用 已更改在版本8.0. | |||
collectionUUID | UUID | UUID 标识发生更改的集合。 新增在版本6.0. | |||
documentKey | document | 包含通过 CRUD 操作创建或修改的文档的 对于分片集合,此字段还显示文档的完整分片键。如果 | |||
fullDocument | document | 通过 CRUD 操作创建或修改的文档。 此字段仅在您将改变流配置为将 有关更多信息,请参阅 更新操作的完整文档查找。 已更改在版本6.0. 从 MongoDB 6.0 开始,如果您使用 | |||
fullDocumentBeforeChange | document | 在操作应用更改之前应用的文档。即前像。 当您使用 新增在版本6.0. | |||
lsid | document | 事务关联会话的标识符。 仅在操作是 多文档事务 的一部分时存在。 | |||
ns | document | 受事件影响的数据库名称或集合。 | |||
ns.coll | 字符串 | 事件发生的集合名称。 | |||
ns.db | 字符串 | 事件发生的数据库名称。 | |||
operationType | 字符串 | 更改通知报告的操作类型。 对于这些更改事件返回值 | |||
updateDescription | document | 一个文档,描述了由更新操作更新或删除的字段。 | |||
updateDescription.disambiguatedPaths | document | 一个文档,提供了对 当 需要将 showExpandedEvents 选项设置为 新增在版本6.1. | |||
updateDescription.removedFields | 数组 | 一个数组,表示由更新操作删除的字段。 | |||
updateDescription.truncatedArrays | 数组 | 一个文档数组,记录使用基于管道的更新执行数组截断的操作,使用以下阶段之一或多个: 如果整个数组被替换,截断将报告在 updateDescription.updatedFields. 下。 | |||
updateDescription.truncatedArrays.field | 字符串 | 截断字段的名称。 | |||
updateDescription.truncatedArrays.newSize | 整数 | 截断数组中的元素数量。 | |||
updateDescription.updatedFields | document | 一个文档,其键对应于由更新操作修改的字段。每个字段的值对应于这些字段的新的值,而不是产生新值的结果。 | |||
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使用默认的保留策略:保留前后图像,直到相应的更改流事件从 操作日志 中删除。如果更改流事件从oplog中删除,则相应的预图像和后图像也会被删除,无论
expireAfterSeconds预图像和后图像保留时间是多少。
其他注意事项
启用预图像和后图像会消耗存储空间并增加处理时间。只有当您需要它们时才启用预图像和后图像。
将更改流事件的大小限制在小于16兆字节。要限制事件大小,您可以
将文档大小限制在8兆字节。如果其他更改流事件字段(如
updateDescription)不是很大,您可以在更改流输出中同时请求预图像和后图像。如果其他更改流事件字段(如
updateDescription)不是很大,则仅请求16兆字节以内文档的后图像。如果仅请求16兆字节以内文档的预图像,则
文档更新仅影响文档结构或内容的一小部分,并且
不会引起
replace更改事件。一个replace事件始终包括后图像。
要请求预图像,您在
db.collection.watch()中将fullDocumentBeforeChange设置为required或whenAvailable。要请求后图像,您可以使用相同的方法设置fullDocument。预图像被写入到
config.system.preimages集合。config.system.preimages集合可能会变得很大。要限制集合大小,您可以像前面所示为预图像设置expireAfterSeconds时间。预图像由后台进程异步删除。
重要
向后不兼容的功能
从MongoDB 6.0开始,如果您正在使用文档预图像和后图像进行更改流,则必须在降级到早期MongoDB版本之前,使用changeStreamPreAndPostImages禁用每个集合的collMod命令。
路径消除歧义
新增在版本6.1.
《updateDescription》字段记录了对文档中特定字段进行的更改。这些字段描述符使用点(.)作为路径分隔符,使用数字作为数组索引,当它包含使用点或数字的字段名称时,这会导致一些歧义。
当一个update事件报告涉及模糊字段的更改时,disambiguatedPaths文档提供了一个路径键,该键包含一个列出每个路径组件的数组。
注意
disambiguatedPaths字段仅在以showExpandedEvents选项启动的更改流中可用
例如,考虑一个列出人们和他们居住的城镇的文档
{ "name": "Anthony Trollope", "home.town": "Oxford", "residences": [ {"0": "Oxford"}, {"1": "Sunbury"} ] }
当一个更新修改了
home.town字段,将其从Oxford更改为London时,它产生的更新描述如下"updateDescription": { "updatedFields": { "home.town": "London" }, "disambiguatedPaths": { "home.town": [ "home.town" ] } } 因为字段
home.town包含一个点,所以disambiguatedPaths字段显示一个只有一个值的数组,以表示town不是home的子字段。当更新修改
residences数组中的值以进行相同的更改时,它产生的更新描述如下"updateDescription": { "updatedFields": { "residences.0.0": "London" }, "disambiguatedPaths": { "residences.0.0": [ "residences", 0, "0" ] } } 模糊路径包括一个整数
0来指示数组索引,以及一个字符串"0"来指示嵌套文档中的字段名称。
有两种情况下,disambiguatedPath不包含数字字段
当路径的第一个字段是数字字符串时(即
0.name)。由于第一个字段不能是数组索引,所以这不是模糊的。当数字字符串字段有前导零时(即,
0001)。由于整数不能有前导零,所以这不是模糊的。
示例
以下示例说明了update事件
{ "_id": { <Resume Token> }, "operationType": "update", "clusterTime": <Timestamp>, "wallTime": <ISODate>, "ns": { "db": "engineering", "coll": "users" }, "documentKey": { "_id": ObjectId("58a4eb4a30c75625e00d2820") }, "updateDescription": { "updatedFields": { "email": "alice@10gen.com" }, "removedFields": ["phoneNumber"], "truncatedArrays": [ { "field" : "vacation_time", "newSize" : 36 } ] } }
以下示例说明了使用fullDocument : updateLookup选项打开的更改流中的update事件
{ "_id": { <Resume Token> }, "operationType": "update", "clusterTime": <Timestamp>, "wallTime": <ISODate>, "ns": { "db": "engineering", "coll": "users" }, "documentKey": { "_id": ObjectId("58a4eb4a30c75625e00d2820") }, "updateDescription": { "updatedFields": { "email": "alice@10gen.com" }, "removedFields": ["phoneNumber"], "truncatedArrays": [ { "field" : "vacation_time", "newSize" : 36 } ], "disambiguatedPaths": { } }, "fullDocument": { "_id": ObjectId("58a4eb4a30c75625e00d2820"), "name": "Alice", "userName": "alice123", "email": "alice@10gen.com", "team": "replication" } }
《fullDocument》文档表示更新文档的最新多数提交版本。《fullDocument》文档可能因更新操作与文档查找之间发生的交错多数提交操作的数量而与更新操作时的文档不同。