Docs 菜单

Docs 主页开发应用程序MongoDB Manual

删除事件

在此页面上

  • 概要
  • 说明
  • 行为
  • 文档前期图像和期后图像
  • 例子
delete

当操作从集合中删除文档时(例如当用户或应用程序执行 delete 命令时),会发生 delete 事件。

字段
类型
说明
_id
文档

一个 BSON 对象,用作变更流事件的标识符。恢复变更流时,此值用作 resumeAfter 参数的 resumeToken_id 对象具有以下形式:

{
"_data" : <BinData|hex string>
}

_data 类型取决于 MongoDB 版本,在某些情况下,还取决于变更流打开或恢复时的特征兼容性版本 (fCV)。有关 _data 类型的完整列表,请参阅恢复令牌

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

clusterTime
时间戳

与事件相关的 oplog 条目中的时间戳。

多文档事务相关的变更流事件通知都具有相同的 clusterTime 值:提交事务的时间。

在分片集群上,具有相同 clusterTime 的事件不一定都与同一事务有关。有些事件与事务完全无关。

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

4.0 版本中的新功能

collectionUUID
UUID

标识发生更改的集合的 UUID

6.0 版本中的新功能

documentKey
文档

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

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

lsid
文档

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

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

4.0 版本中的新功能

ns
文档

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

ns.coll
字符串

发生事件的集合的名称。

ns.db
字符串

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

operationDescription
文档

有关变更操作的其他信息。

仅当变更流使用扩展事件时,此文档及其子字段才会出现。

6.0 版本中的新功能

operationType
字符串

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

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

txnNumber
NumberLong

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

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

4.0 版本中的新功能

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 } } }
      } )
    • 以下示例将特定collection上的expireAfterSeconds设置为100秒:

      use admin
      db.getSiblingDB("my_collection")
      .sensors.watch({ 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设置为requiredwhenAvailable。要请求后图像,您可以使用相同的方法设置fullDocument

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

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

    • 前像由后台进程异步删除。

重要

向后不兼容的功能

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

提示

另请参阅:

以下示例说明了 delete 事件:

{
"_id": { <Resume Token> },
"operationType": "delete",
"clusterTime": <Timestamp>,
"wallTime": <ISODate>,
"ns": {
"db": "engineering",
"coll": "users"
},
"documentKey": {
"_id": ObjectId("599af247bb69cd89961c986d")
}
}

省略了 fullDocument 文档,因为变更流游标将 delete 事件发送到客户端时,该文档不再存在。

← createIndexes 事件