2012-11-11 39 views
1

我在我的文档中有ctimemtime(创建/修改时间)字段。CouchDB自动生成的字段

我该如何让couchDB为我处理这些?例如:

// Create a dog 
curl -X POST http://localhost:5984/dogs -d '{"name": "Bill"}' 
{"ok":true,"id":"75efaeb93aa2ed75ffa0abf9f5006d40","rev":"1-49ce25e3db701c8cb613c1fd18d99619"} 

- >ctimemtime应该是自动生成的

// Update a dog 
curl -X PUT http://localhost:5984/dogs/75efaeb93aa2ed75ffa0abf9f5006d40?rev=1-49ce25e3db701c8cb613c1fd18d99619 -d '{"name": "BILL"}' 

- >mtime都应自动更新


我用validate_doc_update来处理这个跳跃,类似于:

function (newDoc, oldDoc, userCtx) { 
    // 
    // sanity checks 
    // 

    if (oldDoc && newDoc.ctime) throw {"forbidden": "ctime cannot be changed!"} 

    ... 

    // 
    // Auto-generate fields 
    // 

    var now = new Date().toISOString(); 

    // mtime 
    newDoc.mtime = now; 

    // ctime 
    if (!oldDoc) newDoc.ctime = now; 
} 

,但没有运气:它的出现改变newDoc没有效果(通过复制传递?)

谢谢

+0

可能跟踪http://wiki.apache.org/couchdb/Document_Update_Handlers ...欢迎任何示例! :) – abernier

+0

http://stackoverflow.com/questions/5810671/is-it-possible-to-add-fields-to-a-document-in-a-couchdb-validation-function – abernier

+0

http://stackoverflow.com/questions/3009925/couchdb-automatic-timestamps – abernier

回答

1

不,你不能validate_doc_update函数内修改文档内容。如果您使用Document API或通过作为服务器端处理程序的update handlers,则需要在客户端上设置此值。在validate_doc_update函数中,您只能验证此值并接受/拒绝文档的新版本。

由于时间戳不容易控制,客户端可能很容易将“错误”(非实际)值传递给更新处理程序,所以我只能看到在当前时间戳(+/- 2-3)的特定范围内验证mtime的解决方案秒是确定的范围)并且需要ctime字段作为初始文档版本。

但是,这种验证是错误的,因为您将破坏复制:复制文档将有ctimemtime字段从过去和验证功能将在这种情况下拒绝它。

+1

1.好的,我明白我无法“编辑”validate_doc_update文件。 2.关于复制和验证时间的有趣的东西:没有想到这个问题。结论:什么结论? :)简单的方法是信任客户端并且不验证'[cm]时间'。另一方面,更新处理程序将需要额外的HTTP请求,只是为了创建这些字段:这并不理想...... – abernier

+1

结论很简单:创建文档时需要'ctime',但他的未来修改是不允许的。 'mtime'修改是允许的,但是新的值应该比当前的更好,并且现在还不如*(确保你已经处理了UTC)。关于复制只是做出一个决定:具有* old *'mtime'的文档可以覆盖* new * ones。如果可以 - 为那些人制定一个规则,如何覆盖这种价值(由文档作者,特殊角色等)。 – Kxepal

+0

永远不要信任用户的数据(除非它是由你验证的,所以对于客户来说一切都很简单:他们会保持逻辑与你的日期保持一致,否则他们将使用你的更新处理程序。在某些时候,维护人员会厌烦修复文档存储他们会一次又一次地转向你的更新处理程序,当然,仍然有一些窗口可以打破这个逻辑,但是一切都取决于这些字段对你有多大的价值,你可以允许他们进行一些修改吗?至于我,我现在遵循同样的策略,没有任何严重的问题。 – Kxepal