2

特定のフィールドを含むCouchDBデータベースの1つにある既存のすべてのドキュメントの構造を変更する必要があります。現在、フィールドは単純な文字列です。次に例を示します。

{
  // some other fields
  "parameters": {
     "typeId": "something",
     "otherField": "dont_care"
  }
}

この例では、関心のあるフィールドは「typeId」です。この要件が変更されたため、文字列の配列にしたいです:(しかし、明らかにすべてのドキュメントでフィールドの現在の値を保持する必要があります!したがって、上記の例から、結果は次のようになります。

{
  // some other fields
  "parameters": {
     "typeId": [ "something" ] // now we can have more items here
     "otherField": "dont_care"
  }
}

これをどのように達成できるかについてのアイデアはありますか?

これが役立つ場合に備えて、私のJavaWebアプリケーションはEktorpライブラリを介してCouchDBと通信します。

4

1 に答える 1

2

まず、古いスタイルのドキュメントを新しいスタイルのドキュメントに変換し、必要に応じて無関係なドキュメント (設計ドキュメントなど) を正しく処理する関数 (またはメソッド、またはクラス) を作成します。このコードに自信が持てるまで、いくつかの単体テストを作成してください。

次のステップは基本的に、古いスタイルのドキュメントを見つけて、変更ルーチンを使用して新しいスタイルのドキュメントに更新するというループです。

小さなデータ セットがある場合は、/_all_docs?include_docs=trueデータ セット全体を 1 回のバッチで簡単にクエリして処理できます。より大きなデータ セットがある場合は、おそらく古いスタイルのドキュメントを識別するビューを作成します。

function(doc) {
  // map function for "to_do" view
  if(doc.parameters && typeof doc.parameters == "string")
    emit(doc._id, doc)
}

このビューでは、古い形式のドキュメントをすべて表示します。さらに 50 個のドキュメントを取得して変換するには、 GET /my_db/_design/converter/_view/to_do?limit=50. 各行の"value"フィールドはドキュメントの完全なコピーになるため、コンバーター関数をすぐに実行できます。

ドキュメントを変換したら、それをデータベースに POST で戻すか、バッチを作成して を使用_bulk_docsして同じことを行うことができます。(一括ドキュメントも同じですが、少し高速です。) 各ドキュメントが保存されると、to_doビューから消えます。(エラーが発生した場合は409 Conflict、無視してください。) 行が 0 になるまで、この手順を再実行しto_doてください。

どの程度注意する必要があるかは、状況から判断できます。これが本番データである場合は、適切な単体テストを作成する必要があります。開発環境ならこれで決まり!

最後のトリックは、新しい空のデータベースを作成し、メイン データベースを複製することです。これで、アイデアを試すためのサンドボックスが複製されました。結果に満足するまで、サンドボックスを削除して再複製できます。

于 2012-01-11T10:49:28.030 に答える