2011-01-07 32 views
0

我真的很喜歡組織和更新數據的couchdb風格,但是有一些情況我真的需要能夠創建一個條目並確定在返回給用戶之前是否存在等價條目。唯一的情況是,這對我的應用程序來說是絕對必要的,這是用戶註冊我沒有把所有的用戶註冊寫入一個特定的,指定的couchdb實例,稱爲「註冊實例」。我想要一個單一的couchdb實例的絕對原子性(插入,如果已經存在,則失敗)

我想散列user_id到一些_id使用。然後用這個_id執行put,但如果_id已經被插入,則失敗。我需要返回給用戶,表明用戶名已被保留,並且稍後我無法檢測到衝突並在此時解決它,因爲用戶會覺得他們保留了用戶名。

我不明白爲什麼couchdb 不能爲提供某種方式來做到這一點,假設您指定插入文檔的特定「類型」總是被路由到特定的實例。

+0

您是否在運行couchdb服務器羣集?或者當你說實例時,你是否真的指數據庫? (您可能只需指定一個單獨的數據庫進行註冊,然後在多個couchdb服務器之間不斷複製該數據庫,然後可以將其寫入任何地方並且不會出現問題。) – 2011-01-07 11:33:10

回答

2

如果您向單個CouchDB服務器發送PUT請求以獲取新的用戶文檔,您應該已經獲得您想要的行爲。

如果文檔不存在,則會創建新文檔。

如果文檔確實存在那麼它保證會返回409衝突錯誤。這是由於您沒有提供_rev屬性,因爲您沒有嘗試更新預先存在的文檔。

只有當_id和_rev屬性匹配時,CouchDB纔會更新現有文檔。

您可能還希望在文件更新處理程序讀了起來: http://wiki.apache.org/couchdb/Document_Update_Handlers

你可能會使用更新的處理程序來散列USER_ID和動態分配適當的_id。您還可以自定義使用更新處理程序發送哪種錯誤響應。

祝你好運!

+0

正確,但在多主機環境中,行爲必須與僅有一個couchdb實例不同,對嗎?沒有辦法知道您的_id是否與另一個衝突,因爲數據可能沒有傳播到您正在寫入的實例(在多主案例中)。您是否說couchdb在單個實例中檢測到衝突時行爲不同,因爲客戶端會立即得到通知,而不是在「事後」衝突處理程序中處理衝突? – MatternPatching 2011-01-07 19:15:30

相關問題