2

我有一个通过猫鼬使用 MongoDB 的应用程序。在应用程序上有一个名为Notifications. 我想检测每次该集合发生变化(包括删除文档)并采取适当的措施。我在这里读到:

与 Model.remove() 一样,此函数 (Model.findOneAndDelete()、Model.deleteOne()) 不会触发 pre('remove') 或 post('remove') 挂钩。

然后我在这里读到:

更改流为您提供了一种方法来监听通过 MongoDB 数据库的所有插入更新。请注意,除非您连接到 MongoDB 副本集,否则更改流不起作用。

变更流是否将删除视为更新?如何收听数据库中的所有更改,包括删除文档?

4

2 回答 2

1

更改流允许应用程序访问实时数据更改,而不会拖尾 oplog 的复杂性和风险。应用程序可以使用更改流来订阅单个集合、数据库或整个部署上的所有数据更改,并立即对其做出反应。由于变更流使用聚合框架,因此应用程序还可以过滤特定变更或随意转换通知。

几个条件:

  1. 必须是一个副本集(即使是单节点副本集也可以),因为在独立上没有 OpLog。
  2. 变化意味着;删除、更新、插入。所以是的,一旦您订阅,您将获得所有这些事件
  3. 读取不是更改事件。明显地!
  4. 确保将简历令牌保留在某处。因此,您可以从中断的地方继续,例如,在某些时候,您等待更改事件的应用程序很可能会崩溃/失败/抛出异常。因此,理想情况下,您希望回到过去并从上次成功的更改事件继续。
  5. 它在应用程序范围内运行,这意味着代码是由您以您选择的语言编写的,它将监听这些事件。因此,您负责管理和维护 Change Stream 订阅者的状态。从 MongoDB 方面来看,它只是一个游标。
于 2020-07-29T10:20:23.957 回答
0

我认为删除不会受到更新。“更新”是指创建、更新或替换。所以软删除是检测更改流删除的唯一方法

于 2021-10-29T12:22:22.510 回答