Change Events

在本页面

Change Events

以下文档表示变更流响应文档可以具有的所有可能的字段。

{
   _id : { <BSON Object> },
   "operationType" : "<operation>",
   "fullDocument" : { <document> },
   "ns" : {
      "db" : "<database>",
      "coll" : "<collection>"
   },
   "documentKey" : { "_id" : <value> },
   "updateDescription" : {
      "updatedFields" : { <document> },
      "removedFields" : [ "<field>", ... ]
   }
}

有些字段仅适用于某些操作,例如更新。下表描述了变更流响应文档中的每个字段:

FieldTypeDescription
_iddocument与操作有关的元数据。


恢复更改流时,请将此文档用作resumeAfter参数的resumeToken
| operationType | string |发生的操作类型。可以是以下任何值:
insert
delete
replace
update
invalidate|
| fullDocument | document |由操作创建或修改的文档。
对于insertreplace操作,这表示该操作创建的新文档。
对于delete操作,此字段将被省略,因为该文档不再存在。
对于update操作,仅当您将fullDocument设置为updateLookup配置更改流时,才会显示此字段。然后,此字段表示由更新操作修改的文档的最新多数提交版本。如果其他多数提交的操作在原始更新操作和完整文档查找之间修改了文档,则此文档可能与updateDescription中描述的更改有所不同。
| ns | document |更改流针对的数据库和集合的名称空间。
| ns.db | string |数据库的名称。
| ns.coll |字符串|集合的名称。
| documentKey | document |包含由操作创建或修改的文档_id的文档。对于分片集合,还显示文档的完整分片键。如果_id字段已经是分片键的一部分,则不会重复。
| updateDescription | document |描述由更新操作更新或删除的字段的文档。
仅当operationTypeupdate时,才会显示此文档及其字段。
| updateDescription.updatedFields | document |文档,其关键字对应于通过更新操作修改的字段。每个字段的值对应于那些字段的新值,而不是导致新值的运算。
| updateDescription.removedFields | array |由更新操作删除的字段数组。

insert Event

以下示例说明了一个insert事件:

{
   _id: { < Resume Token > },
   operationType: 'insert',
   ns: {
      db: 'engineering',
      coll: 'users'
   },
   documentKey: {
      userName: 'alice123',
      _id: ObjectId("599af247bb69cd89961c986d")
   },
   fullDocument: {
      _id: ObjectId("599af247bb69cd89961c986d"),
      userName: 'alice123',
      name: 'Alice'
   }
}

documentKey字段同时包含_iduserName字段。这表明engineering.users集合已分片,并且在userName_id上具有分片键。

fullDocument文档代表插入时文档的版本。

update Event

以下示例说明了一个update事件:

{
   _id: { < Resume Token > },
   operationType: 'update',
   ns: {
      db: 'engineering',
      coll: 'users'
   },
   documentKey: {
      _id: ObjectId("58a4eb4a30c75625e00d2820")
   },
   updateDescription: {
      updatedFields: {
         email: 'alice@10gen.com'
      },
      removedFields: ['phoneNumber']
   }
}

以下示例说明了使用fullDocument : updateLookup选项打开的更改流的update事件:

{
   _id: { < Resume Token > },
   operationType: 'update',
   ns: {
      db: 'engineering',
      coll: 'users'
   },
   documentKey: {
      _id: ObjectId("58a4eb4a30c75625e00d2820")
   },
   updateDescription: {
      updatedFields: {
         email: 'alice@10gen.com'
      },
      removedFields: ['phoneNumber']
   },
   fullDocument: {
      _id: ObjectId("58a4eb4a30c75625e00d2820"),
      name: 'Alice',
      userName: 'alice123',
      email: 'alice@10gen.com',
      team: 'replication'
   }
}

fullDocument文档代表更新后文档的最新的多数提交版本。 fullDocument文档可能与更新操作时的文档有所不同,这取决于在更新操作和文档查找之间发生的交错多数授权操作的数量。

replace Event

以下示例说明了一个replace事件:

{
   _id: { < Resume Token > },
   operationType: 'replace',
   ns: {
      db: 'engineering',
      coll: 'users'
   },
   documentKey: {
      _id: ObjectId("599af247bb69cd89961c986d")
   },
   fullDocument: {
      _id: ObjectId("599af247bb69cd89961c986d"),
      userName: 'alice123',
      name: 'Alice'
   }
}

replace操作使用 update 命令,并且包括两个阶段:

  • documentKey删除原始文档,然后

  • 使用相同的documentkey插入新文档

replace事件的fullDocument代表插入替换文档后的文档。

delete Event

以下示例说明了一个delete事件:

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

fullDocument文档被省略,因为在更改流游标向 Client 端发送delete事件时该文档不再存在。

invalidate Event

以下示例说明了一个invalidate事件:

{
   _id: { < Resume Token > },
   operationType: 'invalidate'
}

对于针对集合打开的变更流,在影响受监视集合的dropDatabasedroprenameCollection命令之后发生invalidate事件。 invalidate事件关闭更改流游标并发出 signal,表明任何本地缓存的数据均与服务器不同步。

invalidate事件关闭更改流游标。

invalidate event(例如,收藏夹放置或重命名)关闭流后,您将无法恢复更改流。