2012-11-11 44 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