返回集合、数据库或整个群集上的Change Stream
游标。必须在聚合管道的第一阶段使用。
语法
js
{
$changeStream: {
allChangesForCluster: <boolean>,
fullDocument: <string>,
fullDocumentBeforeChange: <string>,
resumeAfter: <int>
showExpandedEvents: <boolean>,
startAfter: <document>
startAtOperationTime: <timestamp>
}
}
allChangesForCluster
可选:设置Change Stream是否包括群集中的所有更改。可能只能在管理数据库中打开。
fullDocument
可选:指定update
操作修改时,更改通知是否包含完整文档的副本。
-
default
:更改通知不包括更新操作的完整文档。 -
required
:更改通知包括更改后文档的副本。如果找不到文档,change stream 将会出错。要使用此选项,必须先使用 collMod 命令启用 changeStreamPreAndPostImages 选项。
6.0 版新增功能。
-
updateLookup
:更改通知包括更改所修改文档的副本。该文档是当前大多数已提交的文档,如果已不存在,则为空。 -
whenAvailable
:变更通知包括一份变更后立即出现的被修改文档的副本,如果文档不可用,则为空。要使用此选项,必须先使用 collMod 命令启用 changeStreamPreAndPostImages 选项。
6.0 版新增功能。
在部分更新的情况下,更改通知还会提供更改说明。
fullDocumentBeforeChange
包括更改前的完整文档。该字段接受以下值:
-
off
:禁用包含更改前的文档。 -
whenAvailable
:包含修改前的文档。如果未修改的文档不可用,查询不会失败。 -
required
:包含更改前的文档。如果未修改的文档不可用,查询将失败。
resumeAfter
指定一个恢复标记作为更改流的逻辑起点。不能与 startAfter
或 startAtOperationTime
字段一起使用。
showExpandedEvents
指定是否包含其他更改事件,如 DDL 和索引操作。
6.0 版新增功能。
startAfter
指定一个恢复标记作为更改流的逻辑起点。不能与 resumeAfter
或 startAtOperationTime
字段一起使用。
startAtOperationTime
指定一个时间作为更改流的逻辑起点。不能与 resumeAfter
或 startAfter
字段一起使用。
举例
使用下面的聚合命令创建一个change stream 游标。
js
var cur = db.names.aggregate( [
{ $changeStream: {} }
] )
运行cur
打开光标。
当Change Stream检测到更改时,next()
方法会返回更改事件通知。例如,在运行cur.next()
之后,MongoDB 会返回与下面类似的文档:
json
{
"_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") }
}