2013-04-24 62 views
1

在我的CouchDB数据库中,我希望所有文档在更改(并强制执行)时添加“updated_at”时间戳。CouchDB:自动更新字段

  • 我不能validation功能
  • 修改文档
  • updates功能将无法运行,除非他们明确要求(所以它会是可能的更新文件,而不是调用特定的更新功能)

我应该如何去实施呢?

回答

2

没有触发_update处理程序,现在没有办法做到这一点。这是跟踪文档更改时间的好主意,但它面临复制问题。

复制正在对公共API的顶部,这意味着:

  1. 在执行这样的触发你必须重复破碎,因为这将是不可能的同步数据,因为它是没有文档修改的情况。由于文档被修改,他会收到新的修订版本,如果您在连续模式下将数据库A中的数据复制到B,将B复制到A,则可能会导致死循环。
  2. 在其他情况下,当复制是固定的,总有办法解决你的触发器。
+0

这是一个耻辱,没有办法获得复制保存数据作为免除自动更新的用户,因为这将解决复制问题。但仍然需要有一个couchdb工具来更新更新字段。它很肮脏,但我认为我会对交付的更新进行验证,以便拒绝,除非现在(只要用户不是复制用户)交付的'updated_at'时间在<可接受的时钟差>范围内。这很丑陋,但它会完成工作! – 2013-04-26 08:35:45

+0

请随时[开放问题](https://issues.apache.org/jira/browse/COUCHDB)关于(: – Kxepal 2013-04-26 09:56:34

0

我可以建议一个解决办法 - 你可以创建一个发出当前日期作为一个关键的一个视图(或它的一部分):

function(doc){ 
    emit(new Date, null); 
} 

这将分配当前日期的所有文件作为一旦视图生成被触发(发生在第一次请求之后),并将在每次更新特定文档时重新分配新日期。

尽管上述内容可以解决您的问题,但由于Kxepal已解释的原因,我建议不要使用它:如果您位于复制网络中,则每个节点将分配自己的日期。因此,考虑到这一点,我可以推荐的最好方法是在客户端解决问题,并只在发布日期已经嵌入的文档中发布。