参考 > 更改流
在本页面
3.6版的新功能。
变更流允许应用程序访问实时数据变更,而不会带来复杂性和拖延oplog的风险。应用程序可以使用更改流来订阅单个集合,数据库或整个部署上的所有数据更改,并立即对其做出反应。由于变更流使用聚合框架,因此应用程序还可以过滤特定变更或随意转换通知。
存储引擎。
副本集和分片群集必须使用WiredTiger存储引擎。变更流还可以用于采用MongoDB静态加密功能的部署 。
副本集协议版本。
副本集和分片群集必须使用副本集协议版本1(pv1
)。
阅读关注“多数”启用。
从MongoDB 4.2开始,无论是否支持读关注,更改流都可用"majority"
。也就是说,majority
可以启用阅读关注支持(默认)或禁用
以使用更改流。
在MongoDB 4.0和更早版本中,更改流仅在"majority"
启用了阅读关注支持时才可用(默认)。
您可以针对以下情况打开变更流:
目标 | 描述 |
---|---|
集合 | 你可以打开一个变换流光标单个集合(除 此页面上的示例使用MongoDB驱动程序打开并使用单个集合的变更流游标。另请参见 |
数据库 | 在MongoDB中4.0开始,你可以打开一个变换流光标单个数据库(不包括 有关MongoDB驱动程序方法,请参阅驱动程序文档。另请参见 |
部署 | 在MongoDB中4.0开始,你可以打开一个变换流光标部署(无论是副本集中或分片集群)来监视除了所有数据库中更改所有非系统集合 有关MongoDB驱动程序方法,请参阅驱动程序文档。另请参见 |
更改流示例
此页面上的示例使用MongoDB驱动程序来说明如何打开集合的更改流游标以及如何使用更改流游标。
要打开变更流:
mongos
。以下示例打开一个集合的变更流,并在光标上进行迭代以检索变更流文档。 [1]
下面的Python示例假定您已连接到MongoDB副本集并访问了
包含inventory
集合的数据库。
以下Java示例假定您已连接到MongoDB副本集并访问了
包含inventory
集合的数据库。
以下示例假定您已连接到MongoDB副本集并访问了
包含inventory
集合的数据库。
以下示例假定您已连接到MongoDB副本集并访问了
包含inventory
集合的数据库。
下面的C示例假定您已连接到MongoDB副本集并访问了
包含inventory
集合的数据库。
以下C#示例假定您已连接到MongoDB副本集并访问了
包含inventory
集合的数据库。
以下示例假定您已连接到MongoDB副本集并访问了
包含inventory
集合的数据库。
下面的Go示例假定您已连接到MongoDB副本集并访问了
包含inventory
集合的数据库。
要从游标检索数据更改事件,请迭代更改流游标。有关变更流事件的信息,请参见变更事件。
与MongoDB部署的连接保持打开状态时,游标保持打开状态,直到发生以下情况之一:
注意
未封闭游标的生命周期取决于语言。
[1] | 从MongoDB 4.0开始,您可以指定a startAtOperationTime
在特定时间点打开游标。如果指定的起点是过去的时间,则必须在操作日志的时间范围内。 |
在配置变更流时,可以通过提供以下一个或多个以下管道阶段的数组来控制变更流的输出:
$addFields
$match
$project
$replaceRoot
$replaceWith
(从MongoDB 4.2开始可用)$redact
$set
(从MongoDB 4.2开始可用)$unset
(从MongoDB 4.2开始可用)在配置变更流时,可以通过提供以下一个或多个以下管道阶段的数组来控制变更流的输出:
$addFields
$match
$project
$replaceRoot
$replaceWith
(从MongoDB 4.2开始可用)$redact
$set
(从MongoDB 4.2开始可用)$unset
(从MongoDB 4.2开始可用)所述pipeline
列表包括单个$match
,其过滤的任何操作,其中阶段username
是alice
,或操作,其中operationType
是delete
。
将传递pipeline
给watch()
方法后,将更改流传递给通知,使其通过指定的pipeline
。
在配置变更流时,可以通过提供以下一个或多个以下管道阶段的数组来控制变更流的输出:
$addFields
$match
$project
$replaceRoot
$replaceWith
(从MongoDB 4.2开始可用)$redact
$set
(从MongoDB 4.2开始可用)$unset
(从MongoDB 4.2开始可用)以下示例使用流来处理更改事件。
另外,您还可以使用迭代器来处理更改事件:
在配置变更流时,可以通过提供以下一个或多个以下管道阶段的数组来控制变更流的输出:
$addFields
$match
$project
$replaceRoot
$replaceWith
(从MongoDB 4.2开始可用)$redact
$set
(从MongoDB 4.2开始可用)$unset
(从MongoDB 4.2开始可用)在配置变更流时,可以通过提供以下一个或多个以下管道阶段的数组来控制变更流的输出:
$addFields
$match
$project
$replaceRoot
$replaceWith
(从MongoDB 4.2开始可用)$redact
$set
(从MongoDB 4.2开始可用)$unset
(从MongoDB 4.2开始可用)在配置变更流时,可以通过提供以下一个或多个以下管道阶段的数组来控制变更流的输出:
$addFields
$match
$project
$replaceRoot
$replaceWith
(从MongoDB 4.2开始可用)$redact
$set
(从MongoDB 4.2开始可用)$unset
(从MongoDB 4.2开始可用)在配置变更流时,可以通过提供以下一个或多个以下管道阶段的数组来控制变更流的输出:
$addFields
$match
$project
$replaceRoot
$replaceWith
(从MongoDB 4.2开始可用)$redact
$set
(从MongoDB 4.2开始可用)$unset
(从MongoDB 4.2开始可用)在配置变更流时,可以通过提供以下一个或多个以下管道阶段的数组来控制变更流的输出:
$addFields
$match
$project
$replaceRoot
$replaceWith
(从MongoDB 4.2开始可用)$redact
$set
(从MongoDB 4.2开始可用)$unset
(从MongoDB 4.2开始可用)你可以控制