文档菜单
文档首页
/
MongoDB 手册
/ /

删除事件

在本页

  • 概要
  • 描述
  • 行为
  • 文档前/后图像
  • 示例
删除

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

字段
类型
描述
_id
文档

一个作为更改流事件标识符的 BSON 对象。此值用作恢复更改流时 resumeAfter 参数的 resumeToken。此 _id 对象具有以下形式

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

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

有关使用 resumeToken 恢复更改流的示例,请参阅 恢复更改流

clusterTime
时间戳

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

由于 oplog 大小限制多文档事务可能会创建多个 oplog 条目。在事务中,给定 oplog 条目中排队的更改流事件共享相同的 clusterTime

具有相同 clusterTime 的事件可能不都与同一事务相关。有些事件根本不与事务相关。从 MongoDB 8.0 版本开始,这适用于任何部署的事件。在先前版本中,此行为仅适用于分片集群的事件。

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

更改版本8.0.

collectionUUID
UUID

UUID 识别发生更改的集合。

版本6.0.

documentKey
文档

包含由CRUD操作创建或修改的文档的_id值的文档。

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

lsid
文档

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

仅在操作是多文档事务的一部分时存在。

ns
文档

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

ns.coll
string

事件发生的集合的名称。

ns.db
string

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

operationDescription
文档

关于更改操作的附加信息。

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

版本6.0.

operationType
string

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

这些更改事件返回值为delete

txnNumber
NumberLong

lsid一起,这是一个帮助唯一标识事务的数字。

仅在操作是多文档事务的一部分时存在。

wallTime

数据库操作的数据库服务器日期和时间。wallTimeclusterTime不同,因为clusterTime是从与数据库操作事件关联的操作日志条目中获取的时间戳。

版本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 }
      } }
      } )
    • 以下示例返回当前的changeStreamOptions设置,包括expireAfterSeconds

      db.adminCommand( { getClusterParameter: "changeStreamOptions" } )
    • expireAfterSeconds设置为“off”将使用默认的保留策略:预和后图像保留到相应的变更流事件从oplog中删除。

    • 如果从oplog中删除了变更流事件,则相关的预和后图像也将被删除,无论expireAfterSeconds预和后图像保留时间如何。

其他注意事项

  • 启用预和后图像会消耗存储空间并增加处理时间。只有当您需要它们时才启用预和后图像。

  • 将变更流事件大小限制在小于16兆字节。要限制事件大小,您可以

    • 将文档大小限制为8兆字节。如果其他变更流事件字段(如updateDescription)不大,您可以在变更流输出中同时请求预和后图像。

    • 如果其他变更流事件字段(如updateDescription)不大,则在变更流输出中仅请求16兆字节以下文档的后图像。

    • 如果以下条件满足,则在变更流输出中仅请求16兆字节以下文档的前图像:

      • 文档更新仅影响文档结构或内容的一小部分

      • 并且不会引起replace更改事件。替换事件始终包括后图像。

  • 要请求前图像,请在db.collection.watch()中将fullDocumentBeforeChange设置为“required”或“whenAvailable”。要请求后图像,请使用相同的方法设置fullDocument

  • 预映像被写入到 config.system.preimages 集合中。

    • config.system.preimages 集合可能会变得很大。为了限制集合大小,您可以设置预映像的 expireAfterSeconds 时间,如前所述。

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

重要

不兼容特性

从 MongoDB 6.0 开始,如果您使用文档预映像和后映像进行 更改流,您必须使用 changeStreamPreAndPostImages 命令禁用每个集合,然后才能将数据库降级到更早的 MongoDB 版本。

提示

另请参阅

以下示例说明了 delete 事件

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

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

后退

创建索引