【问题标题】:CouchDB "_changes" listener updates the doc, which triggers another changeCouchDB“_changes”监听器更新文档,触发另一个变化
【发布时间】:2011-10-31 07:28:04
【问题描述】:

我想编写一个后台程序来监控 CouchDB 的 _changes 提要,并可能更新文档。问题是更新导致另一个_change,我得到一个无限循环!避免这种情况的最佳方法是什么?

例如,以下是特定场景:我有一个 CouchApp,用户可以在其中通过浏览器修改文档。我还有一个 python 程序,它创建文档的 PDF 版本,然后将其作为附件附加到文档本身。我的问题是执行 PUT 附件上传 PDF 也会触发文档更改。我必须能够判断 PDF 上传是否引起了更改。看起来应该很容易,但我想不出一个简单的方法来做到这一点。我宁愿让 PDF 生成器程序保持“无状态”,在数据库本身中保留任何所需的状态。

现在,如果我要求更改文档的用户在文档上设置某种标志以表明它需要被处理,这可以很容易地完成。诀窍是如何在不需要的情况下做到这一点。


我得出的结论是,“_changes”监听器永远不应该修改它监听的文档。就我而言,我决定将我的 PDF 文件附加到一个单独的文档中,在 couchdb 中的一个单独的“数据库”中,但使用相同的“_id”以便于关联。这样我就不会在我正在收听的同一文档上触发“_change”。我无法超越要求每个更改文档的客户端以某种方式将其“标记”为需要处理(通过删除现有附件或以其他方式设置一些“脏”标记)的需要。经过深思熟虑,我认为这对我来说是一条经验法则:在收到该文档的“_change”通知后,您不得修改该文档。有没有人得出同样的结论?

【问题讨论】:

    标签: recursion couchdb infinite


    【解决方案1】:

    使用filter function 并过滤出第二个更改——通过更改文档结构或为更改的文档设置附加标志:

    function(doc, req)
    {
      if(!doc.hasStructuralChange) { //fix this
        return true;
      }
      return false;
    }
    

    function(doc, req)
    {
      if(!doc.changed) { //set doc.changed during first update
        return true;
      }
      return false;
    }
    

    编辑:您可以通过if (doc._attachments)检查附件

    【讨论】:

    • 谢谢,这很快(您在我添加“特定场景”段落之前回答了)。如何检查文档是否有结构变化?你能把它和以前的版本比较一下吗?
    • 无法保证以前的版本可用,因此您必须确保可以使用文档本身检测文档是否需要处理。在您的情况下,您可以测试 doc._attachments 中的 PDF 存根。如果存在,什么也不做。如果缺少,请添加。
    • 在过滤文档功能中,您只能获得当前版本(“更改后”版本),但您可以在客户端设置这样的标志,或使用更新处理程序并设置自动。
    • 过滤器+1。 @Nick Perkins,您也可以在客户端进行过滤,这取决于您的需要。随着软件的增长,集中式过滤器变得更有意义。 PartlyCloudy 是正确的,但我会提交另一个答案,一般会针对此主题进行一些次要考虑。
    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多