2

後でデータベースや特定のドキュメントのポイントインタイム リストアを行うために、CouchDB / Cloudant に変更を保存するにはどうすればよいですか?

4

1 に答える 1

1

私たちはこれを第一級の機能にするために取り組んでいますが、ロールアウトするまでは、これが私たちの顧客の 1 人が行った方法です。

コレクションがあり、それらのコレクション内にリソースがあります。したがって、すべてのドキュメントが のような ID を持つログ データベースを保持するためcollection-resource、「cars」という名前のコレクションと「Ford」という名前のリソースの場合、ログ データベースには という名前のドキュメントがありますcars-ford。そのドキュメントは次のようになります。

{
  versions: [...]
}

そのリソースに触れたり変更したりするたびに、アプリケーションはフィールドの末尾に新しいバージョンを追加してログ記録ドキュメントを更新しversionsます。そのバージョンは次のようになります。

{
  timestamp: '...', # some integer timestamp, for sorting
  doc: {...} # attributes of the document as of the save
}

このビューを使用して、すべてのドキュメントのすべてのバージョンのリストを、各変更が発生した時点で並べ替えて返します。

次に、それを使用して復元などを行う方法は次のとおりです。

リソースの最新バージョンを取得する

ドキュメント全体を取得し、versionsフィールド内の最後の要素を取得します。それが最新版です。

タイムスタンプに関連するすべてのバージョンを表示する

タイムスタンプでソートするビューを作成します。ビューは次のようになります。

{
  map: "function(doc) {
      for(var i in doc.versions){
        emit(doc.versions[i].timestamp, doc.versions[i].doc);
      }
    }"
}

データベースに という名前が付けられloggy、ビューが存在するデザイン ドキュメントに という名前が付けられrestore、ビュー自体に という名前が付けられているとしtimeます。次に、この URL に対して GET リクエストを行います。

{CLOUDANT_HOST}/loggy/_design/restore/_view/time?startkey='...'

...の値startkeyはタイムスタンプです。これは変更されず、指定されたタイムスタンプの後にすべてのバージョンを返します。追加limit=Xすると、タイムスタンプの後に X バージョンが取得されます。追加descending=trueすると、タイムスタンプの後ではなく前のバージョンが取得されます。

リソースの N 番目のリビジョンを表示する

上記とほぼ同じですが、ビューを少し調整します。

{
  map: "function(doc){
      for(var i in doc.versions){
        emit(i, doc.versions[i].doc);
      }
    }"
}

これで、ビューの結果はタイムスタンプではなくインデックスによってキー付けされます。したがって、タイムスタンプを に渡す代わりにstartkey、N 番目のリビジョン前後のバージョンに N を渡すだけです。

コレクションまたはリソースのリビジョン数を取得する

別のビューを使用して、コレクションとリソースでグループ化します。

{
  map: "function(doc){
    // split te ID into collection and resource
    var parts = doc._id.split('-');
    // emit them as keys so we can group by them
    emit([doc.parts[0], doc.parts[1]], null);
  }",
  reduce: "_count"
}

クエリ パラメータgroupgroup_levelを使用して、結果をキーでグループ化します。したがって、carsコレクション内のリソースに触れたイベントの数が必要な場合は、次のようなクエリ文字列を使用します。

?group=true&group_level=1&key="cars"

groupキーが同じ結果をグループ化しますが、 group_level=1「最初のキーでのみグループ化」と表示されます。この場合はコレクションです。keyキーが指定された値と一致するドキュメントのみを返すように指定します。

特定のコレクションのすべてのリソースを取得する

_all_docsビューを使用して、次のようなクエリ文字列を使用します。

?reduce=false&startkey="{collection}-"&endkey="{collection}0"

reduce関数の一部を覚えていますか? その_count値は、「によって発行されたレコードの数を返す」ことを意味しmapます。reduce=false「それをしないでください」という意味です。代わりに、map関数のみが実行されます。

これstartkeyendkeyペアは、Cloudant が結果をソートする方法を使用して、指定されたコレクションで始まる ID に一致する値以外のすべてを除外します。

ドキュメントの更新

復元するバージョンを取得したら、リソースの現在のバージョンを取得し、loggy データベースから過去のバージョンを取得して、現在のバージョンの_rev値を使用して過去のバージョンをリソースに PUT します。バム、復活。ポイントインタイム リストアのためにすすぎ、繰り返します。

于 2013-07-22T19:55:59.520 に答える