12

公式ドキュメントで推奨されているレプリケーションの競合を解決する方法は次のとおりです。

  1. _conflictsドキュメントのフィールドを使用して競合するリビジョンを読み取る(例: ビュー経由)
  2. リストされているすべてのリビジョンのドキュメントを取得します
  3. アプリケーション固有のマージを実行する
  4. 不要なリビジョンを削除する

削除されたドキュメントをマージしたいときに問題が発生します。_conflictsそれらはフィールドには表示されませんが、 _deleted_conflicts. フィールドのみを使用してマージし_conflicts、ドキュメントがローカル データベースで削除され、リモート レプリカで編集された場合、レプリケーションでローカルに復元されます。私のアプリケーション モデルでは、マージ時に削除が常に優先されると想定しています。削除されたドキュメントは、競合する編集に関係なく、削除されたままになります。

では、一見、空でないことを確認し、_deleted_conflicts空でない場合はその文書を削除するのが最も簡単ですよね? うーん...これの問題は、ステップ 4 で編集の競合を解決することによって導入された削除されたリビジョンも含まれている可能性があるため、_deleted_conflictsこの場合の の意味はあいまいです。

ドキュメントを削除済みとしてマークしたり、アプリケーション層でフィルタリングしたりするような大雑把なことを行わずに、CouchDB で削除の競合を処理する標準的な方法は何ですか?

4

1 に答える 1

5

最良の解決策は、予約済みプロパティを使用して、_deleted代わりにドキュメントを削除することですHTTP DELETE。次に、他のプロパティも自由に設定できます。

doc._deleted = true;
doc.deletedByUser = true;
doc.save();

次に、マージ プロセスで _changes フィードをチェックし、フラグが に設定され_deleted_conflictsている _deleted_conflicts 内にリビジョンがある場合はドキュメントを削除します。deletedByUsertrue

これが役立つことを願っています!

于 2014-07-10T20:24:56.423 に答える