28

我删除了一个文档,但我仍然可以在 中看到它_changes,所以我可以看到 last valid _rev,它已被删除,所以获取带有 id 的文档,最后一个修订版只返回:

{
  "_id":"25efa4ec8489d8b89b34c5cad6000059",
  "_rev":"3-a982bd6dccce8f405433f8453ab86880",
  "_deleted":true
}

并且没有其他属性。

在这种情况下我该如何恢复?以前的修订版中看不到_changes。编写空文档(设置_deletedfalse)是否有助于查看所有修订信息?

4

3 回答 3

52

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

  1. 获取已删除的历史记录,例如:

    curl http://example.iriscouch.com/test/_changes
    
  2. 您会看到已删除的文档$id$rev,将空文档作为新版本,例如:

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

    curl http://example.iriscouch.com/test/$id?revs_info=true
    
  4. 获取删除前的版本,例如:

    curl http://example.iriscouch.com/test/$id?rev=$prev_rev
    
  5. 把它放回couchdb,例如:

    curl -X PUT http://example.iriscouch.com/test/$id?rev=$rev -H \'Content-Type: application/json\' -d \'$data\'
    

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

于 2012-06-01T21:05:50.547 回答
18

刚刚从 couchdb 恢复已删除的数据。这就是我在 couchdb irc 上的好人的一点帮助下解决它的方法。

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

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

var 已删除文档 =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"]
             }
     }

3) 现在我们可以构造最后一个修订号,也就是它被删除之前的那个。拉出 _revisions.ids 数组中的第二个 guid 并附加 _revisions.start - 1 和一个“-”字符。这会为您提供文档在被删除之前的修订版本。

var preDeleteRevisionNumber = (deletedDoc._revisions.start - 1) + "-"+ deletedDoc._revisions.ids[1];

4)现在收集原始(预删除数据)并获取$db/$id?rev=$preDeleteRevisionNumber

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

希望这可以帮助某人。

于 2013-05-30T02:40:53.313 回答
3

我找到了一种简单的方法来恢复已删除的文档,只需将以前的(未删除的)修订复制到“自身”。它也适用于附件。

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

或卷曲:

curl -X COPY "http://example.iriscouch.com/test/$id?rev=$rev" -H "Destination: $id"
于 2020-09-02T08:01:21.317 回答