检索刚删除的文档

ava*_*lez 25 couchdb

我删除了一个文档,但我仍然可以看到它_changes,所以我可以看到最后有效_rev,删除了,所以获取带有id和最后修订的doc只返回:

{
  "_id":"25efa4ec8489d8b89b34c5cad6000059",
  "_rev":"3-a982bd6dccce8f405433f8453ab86880",
  "_deleted":true
}
Run Code Online (Sandbox Code Playgroud)

而没有其他属性.

我怎样才能在这种情况下恢复?以前的版本无法看到_changes.写空文档(设置_deletedfalse)有助于查看所有修订信息吗?

ava*_*lez 47

好吧,想通了,如果有人有兴趣:

  1. 删除历史记录,例如:

    curl http://example.iriscouch.com/test/_changes
    
    Run Code Online (Sandbox Code Playgroud)
  2. 你会看到删除的文件有$id$rev,把空文档作为新版本,例如:

    curl -X PUT http://example.iriscouch.com/test/$id?rev=$rev -H "Content-Type: application/json" -d {}
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在您可以获得所有修订信息,例如:

    curl http://example.iriscouch.com/test/$id?revs_info=true
    
    Run Code Online (Sandbox Code Playgroud)
  4. 删除前获取版本,例如:

    curl http://example.iriscouch.com/test/$id?rev=$prev_rev
    
    Run Code Online (Sandbox Code Playgroud)
  5. 把它放回到couchdb,例如:

    curl -X PUT http://example.iriscouch.com/test/$id?rev=$rev -H \'Content-Type: application/json\' -d \'$data\'
    
    Run Code Online (Sandbox Code Playgroud)

如果你有更好的方法或脚本,请告诉我.

  • 你知道为什么在第2步我得到 - {"error"=>"冲突","原因"=>"文件更新冲突."}? (3认同)
  • 谢谢。我已经通过以下Ruby脚本实现了这种取消删除策略:https://gist.github.com/vjt/6158675。您节省了我几个小时的工作,我欠您一个格拉巴酒。:-) (2认同)

小智 14

刚刚从couchdb恢复已删除的数据.这是我在couchdb irc上的好人帮助后解决它的方法.

1)获取请求到您的数据库名称$db/$id?revs=true&open_revs=all在哪里,$db并且$id是您删除的文档的ID.

2)清理响应.这个请求的结果是无效的json,奇怪的是,并且需要清理.以下对我有用:

var deletedDoc = JSON.parse(xhReq.responseText.substring(xhReq.responseText.indexOf("{"), xhReq.responseText.lastIndexOf("}") + 1));

生成的对象如下所示:

  {
       "_id":"37b580b03b903da2b50f88587d89c15d",
       "_rev":"2-bf3a2888dfe1ce0facef18720dcf97e2",
       "_deleted":true,
       "_revisions":{
              "start":2,
              "ids":["bf3a2888dfe1ce0facef18720dcf97e2","85f141069731f6bc77c910b0341e599f"]
             }
     }
Run Code Online (Sandbox Code Playgroud)

3)现在我们可以构建最后一个修订号,即删除前的修订号.拉出_revisions.ids数组中的第二个guid,并使用_revisions.start - 1和" - "字符附加它.这将在文档被删除之前为您提供文档的rev id.

var preDeleteRevisionNumber = (deletedDoc._revisions.start - 1) + "-"+ deletedDoc._revisions.ids[1];
Run Code Online (Sandbox Code Playgroud)

4)现在用get来收集原始(预定数据) $db/$id?rev=$preDeleteRevisionNumber

5)要覆盖旧的已删除条目,您必须发布或放回具有正确ID和最新修订号的文档(不是预删除修订号,而是文档现在已删除的修订号).

希望这有助于某人.


gar*_*heg 8

有关取消删除CouchDB文档的博客文章

我有一篇关于它的文章.希望有人可能会发现它有用,因为更详细的描述事物和更多的青少年友好的方向.干杯.


Pao*_*chi 5

我找到了一种恢复已删除文档的简单方法,只需将以前的(未删除的)修订版复制到“自身”即可。它也可以与附件完美配合。

https://docs.couchdb.org/en/stable/api/document/common.html#copying-from-a-specific-revision

找到文档的 id 和 rev 后(如 avalez 所解释的: https: //stackoverflow.com/a/10857330/846168

无需检索数据并将其放回,只需使用 COPY 操作并将其 $id 作为目标:

COPY http://example.iriscouch.com/test/$id?rev=$rev HTTP/1.1
Accept: application/json
Destination: $id
Run Code Online (Sandbox Code Playgroud)

或使用卷曲:

curl -X COPY "http://example.iriscouch.com/test/$id?rev=$rev" -H "Destination: $id"
Run Code Online (Sandbox Code Playgroud)