2017-09-22 14 views
0

私のノードサーバーの1つに、XMLファイルのFTPをチェックするジョブがあります。見つかった場合は、それをJSONに変換します。現在、couchdbデータベースを消去して、XMLファイル内の新しいデータをすべて以前のものに置き換えます。セット内のすべてのcouchDBオブジェクトを置き換える良い方法はありますか?

私はデータベースを実際に空にする(または存在しない)ことを望んでいないので、私は単純に破壊せずに新しいデータセットで再作成しました。私のノードサーバーは、データベースからローカルのpouchdbに複製し、それを消去(ソフト削除)してから、すべての新しいデータを入れてcouchdbデータベースに複製しています。

ダウンロードが完全に不要であるようだし、ハード削除でこれを行う方法があるはずです。現在のCouchDBデータベース内のすべてのオブジェクトを、ノードサーバーが複製するオブジェクトの新しいセットに置き換える方法はありますか?任意の助け

おかげ

+0

パージ+コンパクトで実行すると、ソフト削除とハード削除の問題が定期的に解決されますか? – Shard

答えて

1

CouchDBのはとても新しいバージョンで(さんが「X」の_idを持つ文書を言わせて)文書を交換し、既存のリビジョンのを知っているあなたを必要とし、ツリー内の文書の改訂履歴を保持します_id/_revのペアを更新することができます。だから、

ドキュメントを更新する必要がある場合には「x」をあなたが変更されたドキュメントごとにこのGET/PUT操作を行うためにあなたの仕事を書き換えることができ

// fetch the document first 
curl -X GET http://localhost:5984/mydb/x 
{ "_id": "x", "_rev": "45-123", "name": "fred"} 
// to be able to update it 
curl -X PUT -d'{ "_id": "x", "_rev": "45-123", "name": "Fred Smith"}' http://localhost:5984/mydb/x 
{ "ok": "true", "_id": "x", "_rev": "46-456"} 

する必要があります。

新しいデータをインポートする前にデータを消去する必要がある場合は、単純に新しいデータベースを作成します。 "mydb2017-09-22"、それにデータをインポートし、真実のソースとして "mydb2017-09-22"を使用するためにデータを使用しているアプリケーションを指示します。これにより、前の正規データベースを安全に安全に削除できます。これにより、現在のソリューションの複製手順が回避されます。

パージは、現在のCouchDBではサポートされていません。これは、データが複製される実装を壊すためです。コンパクションは、不要な旧式のリビジョンの本体を削除してスペースを節約するためのものです。

あなたの問題に関するすべてのことを知らずに、インポートが完了したときに単にデータセットを切り替えることができ、古いデータベースを削除することでそれ自体をクリーンアップするので、 。

+0

"新しいデータをインポートする前にデータを消去する必要がある場合は、単に新しいデータベース、たとえば" mydb2017-09-22 "を作成してデータをインポートし、そのデータを使用しているアプリケーションに" mydb2017-09-22「真実の源として」。 。 。 。 。どのように私はそのデータベースを代わりに使用するようにアプリケーションを指示することができるだろう、確かにアプリが – Shard

+1

から同期する静的な名前を持つデータベースを持っていることがより重要ですあなたに何が重要ですか。場所についてのデータを複製する際に多くの問題が発生するようです。私の提案は、インポートごとにクリーンなデータベースを作成し、準備が整ったら新しいデータベースに切り替えます。 CouchDBはデータベース全体をうまく削除しますが、文書の削除や更新時にはデータがぶら下がってしまいます。 あなたの質問に対する簡単な答えは、データベースを削除して再作成せずに、セット内のすべてのドキュメントを置き換える方法はないが、データなしでは時間がかかるということです。 –

+0

ありがとうGlynn、私はあなたのソリューションを適用することができるように私のアプリケーションにどのデータベースを使用するかを伝える単一のオブジェクトを持つ静的な名前のデータベースを持っています。私は来週に戻ってきます – Shard