2013-07-22 19 views

回答

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。然后,我们将做一个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值。巴姆,恢复。冲洗并重复进行时间点恢复。