クライアントから同期の競合を管理することは可能ですか?
つまり、pouchDB が同期を行って競合を検出した場合、PouchDB が同期しようとしているローカル ドキュメントと、CouchDB ドキュメントの最後のリビジョンを取得することは可能ですか? 両方のドキュメントを取得できれば、それらをユーザーに表示して、保持するバージョンを選択できます...
これはまさに CouchDB と PouchDB が解決するように設計された問題だからです。
基本的に、競合解決に関する CouchDB ドキュメントを読むことができます。そこにあるものはすべて、PouchDB にも適用する必要があります。(そうでない場合は、バグです。;))。CouchDB wikiにも素晴らしい記事があります。
編集:詳細を提供するには、?conflicts=true
( {conflicts:true}
PouchDB で) を使用してドキュメントをフェッチする必要があります。たとえば、次のようなドキュメントを取得します。
http://localhost:5984/db1/foo?conflicts=true
そして、次のようにドキュメントを取得します。
{
"_id":"foo",
"_rev":"2-f3d4c66dcd7596419c76b2498b3ba21f",
"notgonnawork":"this is from the second db",
"_conflicts":["2-c1592ce7b31cc26e91d2f2029c57e621"]
}
ここでは、別のデータベースから導入された競合があり、そのデータベースのリビジョンが (ランダムに) 勝ちました。このドキュメントの現在のリビジョンは 2- で始まり、競合するバージョンも 2- で始まります。これは、両方がリビジョン ツリーの同じレベルにあることを示しています。
競合するバージョンを取得するには、競合する rev を取得して次のように呼び出します。
http://localhost:5984/db1/foo?rev=2-c1592ce7b31cc26e91d2f2029c57e621
そして、あなたは得る:
{
"_id":"foo",
"_rev":"2-c1592ce7b31cc26e91d2f2029c57e621",
"notgonnawork":"this is from the first database"
}
したがって、競合する 2 つのバージョンをユーザーに提示した後、これらの両方の上に 3 番目のリビジョンを追加して、結果を結合するか、失われたバージョンを選択するか、または必要に応じて何でも行うことができます。この次のリビジョンには 3- というプレフィックスが付きます。わかる?
編集:どうやら、競合するバージョンも削除する必要があるようです。そうしないと、_conflicts
. この回答を参照してください。