3

Cloudant にステージングと本番の 2 つのデータベースがあり、これらは Heroku で実行されている Node.JS ベースの Web アプリによって消費されており、ステージングと本番のインスタンスも使用されています。Web アプリには、管理者がデータベースの内容を確認したり、値を微調整したりできる管理領域が含まれています。

2 つの環境間でデータを移動するための最適な方法は何ですか? 新しい値をステージングから本番に移行したい場合もあれば、テストなどを支援するために本番データをステージングに移行したい場合もあるため、双方向である必要があります。

データベース全体のレプリケーションはオプションではありません。通常、全体ではなく、特定のデータベース オブジェクトのみをコピーする必要があるためです。

Node.JS でこれを行うには、どのようなことを検討する必要がありますか? 一般的なアプローチはありますか?設定が間違っていると考えていませんか?

4

1 に答える 1

4

データベース自体でこれを行う方法は 2 つあります (データを移動するためのクライアント コードを記述する方法は最適ではありません)。

レプリケーションに関する最新のリファレンスについては、http://wiki.apache.org/couchdb/Replication を参照してください(Apache の wiki は、この回答を書いている時点でダウンしています)。

名前付きドキュメントの複製

複製するドキュメントとそのドキュメントが正確にわかっている場合は_id、複製を呼び出すときにそれらを配列で指定できます。たとえば、これは と を含む 2 つのドキュメントを複製_iddoc-aますdoc-b

{
  "source": "https://USER:PASS@USER.cloudant.com/dbname-qa",
  "target": "https://USER:PASS@USER.cloudant.com/dbname-production",
  "doc_ids": [ "doc-a", "doc-b" ]
}

フィルタリングされたレプリケーション

移動するレコードをプログラムで指定できる場合は、フィルター処理されたレプリケーションを使用できます。trueドキュメントを複製するかしないかを返す関数を作成しますfalse。例えば...

function(doc) {
  /*
   * This will not replicate doc deletions. Add `&& doc._deleted` to replicate
   * those as well.
   */
  if(doc.type === "user") {
    return true;
  }

  return false;
}

type...属性が と等しいすべてのレコードを複製し"user"ます。

ifブロック全体を削除して、return (doc.type === "user");慣れている場合にのみ行うこともできます。

このコードは、デザイン ドキュメントに保存されます。上記の関数を格納する ddoc の例を次に示します。

{
  "_id": "_design/app",
  "filters": {
    "myfilter": "function(doc) { return (doc.type === \"user\"); }"
  }
}

次に、レプリケーション中に次のようにフィルターを呼び出します。

{
  "source": "https://USER:PASS@USER.cloudant.com/dbname-qa",
  "target": "https://USER:PASS@USER.cloudant.com/dbname-production",
  "filter": "app/myfilter"
}
于 2013-05-02T22:05:04.547 に答える