Recursion CouchDB"_更改“;侦听器更新文档,这将触发另一个更改

Recursion CouchDB"_更改“;侦听器更新文档,这将触发另一个更改,recursion,couchdb,infinite,Recursion,Couchdb,Infinite,我想写一个后台程序来监视CouchDB的_changes提要,并可能更新文档。问题是更新导致了另一个改变,我得到了一个无休止的循环!避免这种情况的最好方法是什么 例如,这里是一个特定的场景:我有一个CouchApp,用户通过浏览器修改文档。我还有一个python程序,它创建文档的PDF版本,然后将其作为附加文件附加到文档本身。我的问题是,上传PDF时使用PUT附件也会触发文档更改。我必须能够判断PDF上传是否导致了更改。看起来应该很容易,但我想不出一个简单的方法来做。我宁愿让PDF生成器程序保持

我想写一个后台程序来监视CouchDB的_changes提要,并可能更新文档。问题是更新导致了另一个改变,我得到了一个无休止的循环!避免这种情况的最好方法是什么

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

现在,如果我要求更改文档的用户在文档上设置某种标志,以指示需要处理文档,那么可以很容易地做到这一点。诀窍是如何做到这一点而不需要这样做


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

使用and并过滤掉第二个更改–通过文档结构更改或为更改的文档设置附加标志:

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


编辑:您可以通过
if(doc.\u attachments)

检查附件,谢谢,这很快(您在我添加“特定场景”段落之前回答了)。如何检查文档是否有结构更改?您能将其与以前的版本进行比较吗?不能保证以前的版本可用,因此您必须确保可以使用文档本身检测文档是否需要处理。在您的情况下,您可以测试文档中的PDF存根。\u附件。如果有,什么也不做。如果缺少,请添加它。在“筛选文档”功能中,您只能获取当前修订(“更改后”修订),但您可以在客户端或使用更新处理程序自动设置此标志。+1用于筛选@Nick Perkins,你也可以在客户端进行过滤,这取决于你的需要。随着软件的发展,集中式过滤器更有意义。PartlyCloudy是正确的,但我将提交另一个答案,其中包含一些关于这个主题的小考虑。
function(doc, req)
{
  if(!doc.changed) { //set doc.changed during first update
    return true;
  }
  return false;
}