更改流(聚合)
定义
$changeStream
返回一个更改流游标,应用于集合、数据库或整个集群。必须在聚合管道的第一阶段使用。
阶段
$changeStream
具有以下语法{ $changeStream: { allChangesForCluster: <boolean>, fullDocument: <string>, fullDocumentBeforeChange: <string>, resumeAfter: <document> showExpandedEvents: <boolean>, startAfter: <document> startAtOperationTime: <timestamp> } } 参数描述allChangesForCluster
可选:设置是否更改流应包含集群中的所有更改。仅可在admin
数据库上打开。fullDocument
可选:指定更改通知是否包含在
update
操作修改时的完整文档副本。默认
:更改通知在update
操作中不包含完整文档。必需
:更改通知包含修改后立即出现的修改文档副本。如果找不到文档,更改流将抛出错误。要使用此选项,您必须首先使用
collMod
命令来启用changeStreamPreAndPostImages
选项。新功能在版本中6.0.
updateLookup
:更改通知包含更改修改的文档副本。此文档是当前大多数已提交的文档或如果它不存在则为null
。whenAvailable
:更改通知包含更改后立即出现的修改文档副本或如果文档不可用则为null
。要使用此选项,您必须首先使用
collMod
命令来启用changeStreamPreAndPostImages
选项。新功能在版本中6.0.
在部分更新的情况下,更改通知还提供更改的描述。
fullDocumentBeforeChange
包含更改之前的完整文档。该字段接受以下值
off
:禁用包含更改之前的文档。whenAvailable
:包含更改之前的文档。如果未修改的文档不可用,则查询不会失败。required
:包含更改之前的文档。如果未修改的文档不可用,则查询会失败。
resumeAfter
可选。指定一个恢复令牌作为更改流的逻辑起始点。不能用于在
invalidate
事件之后恢复更改流。resumeAfter
与startAfter
和startAtOperationTime
互斥。showExpandedEvents
指定是否包含额外的更改事件,例如DDL和索引操作。
新功能在版本中6.0.
startAfter
可选。指定一个恢复令牌作为更改流的逻辑起始点。与
resumeAfter
不同,startAfter
可以通过创建新的更改流来在invalidate
事件之后恢复通知。startAfter
与resumeAfter
和startAtOperationTime
互斥。startAtOperationTime
指定一个时间作为更改流的逻辑起始点。不能与resumeAfter
或startAfter
字段一起使用。
稳定API支持
变更流包含在稳定API V1中。然而,showExpandedEvents选项不包括在稳定API V1中。
示例
要使用聚合阶段创建变更流游标,请运行aggregate
命令。
var cur = db.names.aggregate( [ { $changeStream: {} } ] )
要打开游标,运行cur
。
当变更流检测到变更时,next()
方法返回变更事件通知。例如,运行cur.next()
后,MongoDB返回类似于以下文档的结果
{ "_id": { _data: "8262E2EE54000000022B022C0100296E5A100448E5E3DD01364019AE8FE8C6859527E046645F6964006462E2EE54C8756C0D5CF6F0720004" }, "operationType": "insert", "clusterTime": Timestamp({ t: 1659039316, i: 2 }), "wallTime": ISODate("2022-07-28T20:15:16.148Z"), "fullDocument": { "_id": ObjectId("62e2ee54c8756c0d5cf6f072"), "name": "Walker Percy" }, "ns": { "db": "test", "coll": "names" }, "documentKey": { _id: ObjectId("62e2ee54c8756c0d5cf6f072") } }
有关变更流通知的更多信息,请参阅变更事件。