定义
$changeStream返回集合、数据库或整个集群上的变更流游标。 必须用作聚合管道中的第一阶段。
$changeStream阶段采用以下语法:{ $changeStream: { allChangesForCluster: <boolean>, fullDocument: <string>, resumeAfter: <document> startAfter: <document> startAtOperationTime: <timestamp> } } Parameter说明allChangesForCluster可选:设置变更流是否应包括集群中的所有更改。只能在
admin数据库中打开。fullDocument可选:指定在通过
update操作执行修改时,变更通知是否包含完整文档的副本。default:更改通知不包含update操作的完整文档。updateLookup:更改通知包括由更改修改的文档的副本。该文档是当前多数提交文档,如果该多数提交文档不再存在,则为null。
对于部分更新,变更通知还提供变更的描述。
resumeAfter可选。指定一个恢复令牌作为变更流的逻辑起点。无法用于在
invalidate事件之后恢复变更流。resumeAfter与startAfter和startAtOperationTime互斥。startAfter可选。指定一个恢复令牌作为变更流的逻辑起点。与
resumeAfter不同,startAfter可在出现invalidate事件之后通过创建新的变更流来恢复通知。startAfter与resumeAfter和startAtOperationTime互斥。startAtOperationTime指定一个时间作为变更流的逻辑起点。不能与
resumeAfter或startAfter字段一起使用。
稳定的 API 支持
变更流包含在Stable 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 }), "fullDocument": { "_id": ObjectId("62e2ee54c8756c0d5cf6f072"), "name": "Walker Percy" }, "ns": { "db": "test", "coll": "names" }, "documentKey": { _id: ObjectId("62e2ee54c8756c0d5cf6f072") } }
有关变更流通知的更多信息,请参阅变更事件。