2011-03-25 105 views
9

我知道我可以检索“可用”文档的所有修订,但我可以找回已删除的文件的最后一个“可用”的版本?我不知道删除之前的版本ID。这是我目前正在运行的命令...它返回{"error":"not_found","reason":"deleted"}我可以检索已删除文档的所有修订版本吗?

卷曲-X GET http://localhost:5984/test_database/a213ccad?revs_info=true

+0

先后后删除了执行的数据库压缩? – bdargan 2011-04-01 10:03:02

+2

沙发的版本是为了满足它的需求,而不是我们的需求。旧版本不一定被复制,旧版本可能在压缩过程中消失。 – 2011-05-13 18:33:42

+1

这不是事实,文档的最后删除版本始终保留以确保复制的一致性。压缩仅删除旧版本。 – smathy 2012-06-26 03:16:12

回答

0

我最近打了好几次,所以任何人都徘徊由...

这个问题通常从需要知道哪些文件是一种编程模型结果删除。由于'类型'之类的用户键不存在删除,而_id最好由沙发分配,因此通常会很高兴在顶部下方看到关于删除的文档的内容。另一种方法是创建一个为文档设置已删除的过程:True(无下划线),并调整任何侦听器过滤器等,以查找已删除:True。其中一个进程可以实际删除文档。这意味着在文档上触发的任何进程都不需要跟踪最终删除的_id。

+0

你可以通过使用_deleted:true(以及其他任何你想存储的字段)来保存文档,并在这样的编程模型中拥有依赖进程来监视_changes以做出任何他们喜欢的清理来响应删除。 – natevw 2012-05-02 23:02:02

1

你可以删除的文件的最后一次修改,但首先你必须首先确定其版本ID。要做到这一点,你可以查询_changes饲料和扫描文件的删除记录 - 这将包含最后一次修改,然后你可以用它取docid?rev=N-XXXXX

我记得使这个容易(因为这样做的改变饲料的全扫描显然是不理想的日常使用)的一些邮件列表讨论,但我不知道有什么后果。

+0

'/ _changes'仍然是唯一的方法。 – smathy 2012-06-26 03:18:25

6

我有这个问题,试图恢复已删除的文件,这里是我的解决方案:

0),直到你运行一个压实,被删除的历史,如:

curl http://example.iriscouch.com/test/_changes 

1)你会看到有$ ID和$ REV删除的文件,把空文档作为新版本,如:

curl -X PUT http://example.iriscouch.com/test/$id?rev=$rev -H "Content-Type: application/json" -d {} 

2)现在你可以得到所有的修订信息,例如:

curl http://example.iriscouch.com/test/$id?revs_info=true 

Retrieve just deleted document

+1

即使在压缩后,您仍然会在_changes中看到已删除的文档。压缩仅删除非叶文档体,即使在压缩之后,所有[好,达到revs_limit]修订版元数据也保留以及文档的最终删除版本。 – natevw 2013-02-13 20:45:41

1

见此外_changes,这样做的另一个好方法是使用keys_all_docs

GET $MYDB/_all_docs?keys=["foo"] - >

{ 
    "offset": 0, 
    "rows": [ 
     { 
      "id": "foo", 
      "key": "foo", 
      "value": { 
       "deleted": true, 
       "rev": "2-eec205a9d413992850a6e32678485900" 
      } 
     } 
    ], 
    "total_rows": 0 
} 

注意,它有为keys; key将不起作用,因为只有keys会返回已删除文档的信息。

+0

如果您有很多密钥,并且IIUC可以将密钥列表发布到相同的URL。 – joeforker 2014-08-22 20:20:55

相关问题