2014-02-25 151 views
2

我知道當您在數據庫A上創建文檔時,複製數據庫,然後在數據庫A和數據庫B上對其進行更改,然後再次複製,則會發生衝突,但兩個版本都存在版本樹。CouchDB複製覆蓋文檔

但是,當您使用數據庫A上的ID XY創建文檔,然後在數據庫B上創建具有相同標識但內容不同的文檔然後複製時,只存在其中一個版本。另一個被覆蓋。

原因是,因爲兩個文檔都沒有版本,所以複製算法無法知道它們都存在?

如果是的話有兩種方式來保存兩個版本?

使用案例是有兩個數據庫,一個本地,一個在線。他們互相同步。在兩個數據庫用戶創建文檔。但是我需要確保IF連接失敗一段時間後,兩者都可以創建文檔,並且每當連接返回時我都可以合併它們。我猜這裏的硬盤部分是CREATE而不是UPDATE嗎?

回答

4

首先,爲了清楚起見,CouchDB確實不是覆蓋數據。您寫入的數據被遺忘的唯一方法是成功更新文檔。

CouchDB將在複製期間引入新的分支(又名衝突)以保留所有內容的分歧。如果你看到的是可重現的,那麼它就是一個錯誤。下面是我的成績單,儘管這表明CouchDB的確如預期的那樣保留了兩個修訂版;

捲曲127.0.0.1:5984/db1 -XPUT { 「OK」:真正}

捲曲127.0.0.1:5984/db2 -XPUT { 「OK」:真正}

curl 127.0.0.1:5984/db1/mydoc -XPUT -d'{「foo」:true}'

{「ok」:true,「id」:「mydoc」,「rev」:「1-89248382088d08ccb7183515daf390b8 「}

curl 127.0.0.1:5984/db2/mydoc -XPUT -d'{」foo「:false}'

{ 「OK」:真, 「ID」: 「mydoc」, 「REV」: 「1-1153b140e4c8674e2e6425c94de860a0」}

捲曲127.0.0.1:5984/_replicate -Hcontent-類型:application/JSON - d '{ 「源」: 「DB1」, 「目標」: 「DB2」}'

{ 「OK」:真實,...}

捲曲「127.0.0.1:5984/db2/mydoc ?衝突=真」

{ 「_id」: 「mydoc」, 「_ REV」: 「1-89248382088d08ccb7183515daf390b8」, 「foo」 的:真, 「_衝突」:[ 「1-1153b140e4c8674e2e6425c94de860a0」]}

+0

你先生是對的!我覺得很愚蠢。出於某種原因,我希望兩個版本都可以在蒲團中看到。但是,如果使用{衝突:「true」}或衝突=「true」來獲取文檔,則兩個版本都會顯示,我可以照顧合併。謝謝你 – yoshiii1988

+0

你非常歡迎。我們用fauxton取代蒲團,並且計劃構建一個顯示衝突的用戶界面(並幫助您解決它們!)。 –