CouchDB 检索刚删除的文档

jtw3ybtb  于 2022-12-09  发布在  CouchDB
关注(0)|答案(3)|浏览(222)

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

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

而没有其他属性。
在这种情况下,我该如何恢复?在_changes中看不到以前的修订版。写入空文档(将_deleted设置为false)是否有助于查看所有修订版信息?

tag5nh1u

tag5nh1u1#

好了,想通了,如果有人感兴趣:
1.获取已删除的历史记录,例如:

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 {}

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

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

1.获取删除前的版本,例如:

curl http://example.iriscouch.com/test/$id?rev=$prev_rev

1.将其放回couchdb,例如:

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

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

nhn9ugyo

nhn9ugyo2#

刚刚从couchdb恢复了被删除的数据。这就是我如何在couchdb irc上的好人的一点帮助下解决它的。
1)对$db/$id?revs=true&open_revs=all的get请求,其中$db是数据库名称,$id是已删除文档的ID。
2)清理响应。奇怪的是,这个请求的结果不是有效的json,需要清理。下面的方法对我很有效:
变量已删除文档= 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)现在,使用get to $db/$id?rev=$preDeleteRevisionNumber收集原始数据(删除前的数据
5)要覆盖旧的已删除条目,您必须使用正确的ID和最新的修订号(不是删除前的修订号,而是已删除文档的修订号)过帐或放回文档。
希望这能帮助到一些人。

bvjxkvbb

bvjxkvbb3#

我发现了一个简单的方法来恢复一个已删除的文档,只需将以前的(未删除的)修订复制到“本身”。它也可以完美地与附件一起工作。
https://docs.couchdb.org/en/stable/api/document/common.html#copying-from-a-specific-revision
在您找到您文档的id和rev之后(正如avalez解释的那样:(第10页)
不要检索数据并将其放回原处,只需使用COPY操作并将其$id作为目标:

COPY http://example.iriscouch.com/test/$id?rev=$rev HTTP/1.1
Accept: application/json
Destination: $id

或 curl :

curl -X COPY "http://example.iriscouch.com/test/$id?rev=$rev" -H "Destination: $id"

相关问题