首页 > 解决方案 > CouchDB 过滤功能和连续馈送

问题描述

我有一个基于文档属性的过滤器功能过滤,例如“版本:A ”,它工作正常,直到在某个时间点有一个文档更新,当这个属性“版本:A ”被删除(或更新为“版本:B ” )。

此时我希望收到通知文档已更新,类似于文档被删除时的通知,但找不到有效的方法(没有侦听和处理所有文档更改)。

希望我只是遗漏了一些东西,这不是设计限制。

标签: couchdb

解决方案


虽然我的另一个答案是一种有效的方法,但我昨天遇到了同样的情况,并决定考虑使用 Mango 选择器来完成这项工作。我做了以下事情:

  1. 建立由查询选择器过滤的更改提要(请参阅 /db/_changes 的“_selector”过滤器)
  2. 执行查询(db/_find)并记录结果
  3. 建立第二个更改提要,仅在 (2) 中返回的文档中进行过滤(请参阅 /db/_changes 的“_doc_ids”过滤器)

(1) 处的提要让您知道新文档何时与您的查询匹配,以及更改前后与您的查询匹配的文档的编辑。

(2) 处的提要让您知道何时对先前与您的查询匹配的文档进行了更改,无论在更改后它是否与您的查询匹配。

这些提要的组合涵盖了所有情况,尽管有一些误报。在任一提要发生更改时,请拆除 (3) 处的更改提要并重做步骤 (2) 和 (3)。

现在,关于这种方法的一些注意事项:

  • 这实际上仅适用于查询返回的文档数量很少的情况,因为如果在第二个提要中按 _id 进行过滤。
  • 如果第一个更改提要中有大量更改,则必须注意确保正确建立第二个提要。
  • 在某些情况下,两个提要中都会出现更改。最好避免两次反应。
  • 如果预计更改会频繁发生,那么如果您的客户不需要处理每个更改通知,则使用去抖动或速率限制。

这种方法对我和我必须处理的案例都很有效。

参考:


推荐阅读