2011-11-18 113 views
1

我有兩個數據庫,在這兩個數據庫之間觸發雙向複製。如何合併文檔的兩個衝突修訂版本?

如果它們之間的網絡鏈接中斷,並且在兩個數據庫中具有相同Id的特定文檔上進行更改,則會發生衝突,並且在鏈接之後可能會選擇其中一個修訂版本恢復。

我想合併兩個衝突的修訂版,以免丟失任何更改。我怎麼去解決這個問題?

回答

9

有一個在CouchDB的書好章在線瀏覽: http://guide.couchdb.org/draft/conflicts.html

您也可以從維基閱讀: http://wiki.apache.org/couchdb/Replication_and_conflicts

下面是一些摘錄。

找到衝突:

function(doc) { 
    if(doc._conflicts) { 
    emit(doc._conflicts, null); 
    } 
} 

一旦你找到了衝突,你必須確定如何將兩個文件合併。 CouchDB不做任何假設,所以你必須自己做。這是因爲合併是一個領域問題。一旦你有一個執行合併的策略,然後處理文檔。

讓我們得到了冠軍,和衝突的文件

GET /db/bob?conflicts=true 

你會得到冠軍加上含有其他的轉速陣列的_conflicts成員,衝突的修訂版本。您可以使用後續的GET/db/bob?rev = xxxx操作單獨獲取它們。

一旦檢索到所有衝突的修訂版本,應用程序就可以選擇將它們全部顯示給用戶。或者它可以嘗試合併它們,寫回合併版本,並刪除衝突版本 - 即永久解決衝突。

如上所述,您需要更新一個修訂版並明確刪除所有衝突的修訂版。這可以使用_bulk_docs的單個POST完成,在您想要刪除的修訂版上設置「_deleted」:true。

我已經從wiki和CouchDB書中拉上了上面的內容,但是我希望它能夠更清楚地從何處着手。

+0

非常感謝瑞恩,它確實會拋出一些光。 – Fortu