我删除了一个文档,但我仍然可以在_changes
中看到它,因此我可以看到最后一个有效的_rev
,它已被删除,因此获取带有id和最后修订版的doc只会返回:
{
"_id":"25efa4ec8489d8b89b34c5cad6000059",
"_rev":"3-a982bd6dccce8f405433f8453ab86880",
"_deleted":true
}
,没有其他属性。
在这种情况下如何恢复?在_changes
中无法看到以前的修订版。写空文档(将_deleted
设置为false
)是否有助于查看所有修订信息?
答案 0 :(得分:44)
好的,想通了,如果有人感兴趣的话:
删除历史记录,例如:
curl http://example.iriscouch.com/test/_changes
您会看到包含$id
和$rev
的已删除文档,将空文档作为新版本,例如:
curl -X PUT http://example.iriscouch.com/test/$id?rev=$rev -H "Content-Type: application/json" -d {}
现在您可以获得所有修订信息,例如:
curl http://example.iriscouch.com/test/$id?revs_info=true
在删除前获取版本,例如:
curl http://example.iriscouch.com/test/$id?rev=$prev_rev
把它放回到couchdb,例如:
curl -X PUT http://example.iriscouch.com/test/$id?rev=$rev -H \'Content-Type: application/json\' -d \'$data\'
如果您有更好的方法或脚本,请告诉我。
答案 1 :(得分:13)
刚刚从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"]
}
}
3)现在我们可以构建最后一个修订号,即删除前的修订号。拉出_revisions.ids数组中的第二个guid,并使用_revisions.start - 1和“ - ”字符附加它。这将在文档删除之前为您提供文档的rev id。
var preDeleteRevisionNumber = (deletedDoc._revisions.start - 1) + "-"+ deletedDoc._revisions.ids[1];
4)现在使用get $db/$id?rev=$preDeleteRevisionNumber
5)要覆盖旧的已删除条目,您必须发布或放回具有正确ID和最新修订号的文档(不是预删除修订号,而是文档现在已删除的修订号)
希望这有助于某人。
答案 2 :(得分:8)
Blog post about undeleting CouchDB documents
我有一篇关于它的文章。希望有人可能会发现它有用,因为更详细的描述事物和更多的青少年友好的方向。欢呼声。
答案 3 :(得分:1)
我找到了一种还原已删除文档的简单方法,只需将先前(未删除)的修订复制到“自身”即可。它也可以完美地与附件一起使用。
https://docs.couchdb.org/en/stable/api/document/common.html#copying-from-a-specific-revision
找到文档的ID和修订版后(如阿瓦雷斯解释:https://stackoverflow.com/a/10857330/846168)
与其检索数据并放回去,不如直接使用以$ id为目标的COPY操作
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 \'Content-Type: application/json\' -H -H \'Destination: $id\'