2011-07-31 26 views
4

シンプルなCouchDBを使って、CouchDBの圧縮が削除されたドキュメントに全く無関心であるという理論にします。それを取得しようとしたときにDELETEメソッドを介してソファからドキュメントを削除CouchDBの圧縮と文書の削除 - 無関係の圧縮?

には、次のものが得られます。

はlocalhost:5984/ENQ /削除-DOC-ID { "エラー": "NOT_FOUND"、 "理由" : "deleted"}

はlocalhost:5984/ENQ/_compact { 'OK':真}

とチェック締固めが "compact_running" 完了しました:偽私はCouchDBのを期待する今

今、私はデータベースを圧縮しますNOT_FOUND返し、理由 "行方不明" の単純なGETの localhostに:5984/ENQ /削除-DOC-ID { "エラー": "NOT_FOUND"、 "理由": "削除"}

とをしようと? rev = deleted_revは私に完全なドキュメントを与えますデータ。

は、だから私はCouchDBの圧縮は、圧密の一部であるかを決定する際に回転数で削除ドキュメントとシンプルなルックスのための特別な治療は再び制限を吹けない示し思考に修正しています。削除されたドキュメントに設定できる特別なrev_limitはありますか?

確かに唯一の解決策は、_purgeすることはできませんか?現時点では何千もの孤立した削除済みのドキュメントが必要ですが、通常のドキュメントのバージョン履歴を維持したい場合、rev_limitを1に減らしたい場合は

複製の問題は?パージを意識している?

答えて

4

、文書を追加することを削除し、その後、自然のままの状態にCouchDBのデータベースを返さない圧縮。削除された文書は圧縮によって保持されますが、通常の場合、結果の文書は小さくなります(_id、_rev、_deleted = true)。この理由は、複製です。次のことを想像して:

  • 文書を作成します。
  • リモートDBに複製DB。
  • 文書を削除します。
  • コンパクトDB。
  • 再びリモートDBに複製DB。

削除+圧縮後に文書が完全に削除された場合、2番目の複製は、文書が削除されたことをリモートDBに伝えることを知らせません。これにより、2つのDBが矛盾することになります。

の文書がではないことが報告されました。しかし、それはHTTP DELETEメソッドAFAIKには関係しませんでした(私は間違っているかもしれませんが)。チケットはここにある:

https://issues.apache.org/jira/browse/COUCHDB-1141

基本的な考え方は、監査情報が圧密によって保持されることDELETEに含まれ得ることです。完全な文書本体にDELETEメソッドを投稿していないことを確認してください(文書を実際に削除しない理由を説明するかもしれません)。

7

削除されたドキュメントは永久に保持されます(レプリカ間の最終的な一貫性を確保することが不可欠であるため)。したがって、記述した動作は意図的です。

できるだけ効率的に文書を削除するには、_id、_rev、およびdeletedフラグのみが格納されるため、DELETE動詞を使用します。もちろん、POSTまたはPUTを使用して、手動でこれを達成することもできます。

最後に、_purgeは、たとえば、重要なパスワードをcouchdb文書に入れてディスクから削除する必要がある極端な場合にのみ存在します。データベースのプルーニングにはお勧めできませんが、通常はビューを無効にして(完全な再構築を強制する)、レプリケーションをやりすぎます。

1

私たちの経験から、ドキュメントデータを完全に削除するには、IDとコンパクトでDELETEを実行する必要があります。

上記で指摘したように、あなたのデータベースにはまだ "ヘッダデータ"が残っています。