2011-08-08 65 views
10

根據CouchDB Wiki on PUT operations批量更新每個文檔沒有_rev值的CouchDB數據庫?

要更新現有文檔,還要發出PUT請求。在這種情況下,JSON主體必須包含一個_rev屬性,它允許CouchDB知道編輯所依據的修訂版本。如果當前存儲在數據庫中的文檔修訂版不匹配,則返回409衝突錯誤。

我的目標是執行bulk_docs更新

curl -X POST [domain]/[couch db name]/_bulk_docs -H "Content-type: application/json" -d @[some document].json 

我的工作流程是這樣的:

  1. 我的數據是在谷歌文檔電子表格。
  2. 我轉換電子表格數據,以JSON通過複製並粘貼到Mr. Data Converter
  3. 我使用捲曲(如上圖所示)來添加/更新文檔

的問題是,我第一次添加新文檔,一切工作完美,但下次我張貼相同的文件,我得到每個文件的以下錯誤:

... {「id」:「28」,「error」:「conflict」,「reason 「:」文檔更新衝突。「} ...

有什麼方法可以更新現有文檔,而不包括_rev屬性?

回答

18

通過設計,您無法盲目更新CouchDB文檔,您只能嘗試更新文檔的特定修訂版。

對於單個文檔,您可以使用CouchDB update handler來隱藏客戶端,因爲更新處理程序將傳遞包含其修訂的現有文檔(如果存在)。

有關文檔,收集使用_bulk_docs時,可以添加"new_edits": false這將強行插入的衝突,而不是排斥(雖然你仍然需要通過_rev,它只是沒有爲當前一)。

所有這一切說,遵守規則會更好。抓住您想要更新的文檔的當前版本,嘗試更新它,如果您獲得409,獲取新版本,根據需要合併並再次更新。

+0

更新處理程序似乎是更新數據的方法。它會更快,因爲您不必下載每個文檔,將它合併到客戶端,然後再次上傳。相反,更新處理程序可以爲您完成1/3的網絡活動! –

+0

@DobesVandermeer不是通用的。由於更新處理程序不支持批處理操作,所以這是每次更新/持續的一個請求。如果您需要同時執行2-4個以上的操作,請執行批處理操作,因爲通常需要2-4次請求,具體取決於具體情況,例如更新10個文檔。當然,如果你使用'new_edits':false',你可以在1個請求中進行批量持久化/替換,但是請注意'new_edits'是[旨在被複制器使用](http://goo.gl/EFFofn )。一個缺點是,它不保留修訂歷史,我想知道如果這可能會干擾複製... –

+0

@DominykasMostauskis啊是的,好點。 OP可能想要進行批量下載,計算新值和批量上傳,這是總體上較少的事務。只要這一切都適合內存。 –