後でデータベースや特定のドキュメントのポイントインタイム リストアを行うために、CouchDB / Cloudant に変更を保存するにはどうすればよいですか?
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"
}
クエリ パラメータgroup
とgroup_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
関数のみが実行されます。
これstartkey
とendkey
ペアは、Cloudant が結果をソートする方法を使用して、指定されたコレクションで始まる ID に一致する値以外のすべてを除外します。
ドキュメントの更新
復元するバージョンを取得したら、リソースの現在のバージョンを取得し、loggy データベースから過去のバージョンを取得して、現在のバージョンの_rev
値を使用して過去のバージョンをリソースに PUT します。バム、復活。ポイントインタイム リストアのためにすすぎ、繰り返します。