3

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

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

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


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

4

1 回答 1

4

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

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)

于 2011-08-20T18:12:38.167 回答