【问题标题】:Retrieve just deleted document检索刚刚删除的文档
【发布时间】:2021-03-26 00:26:45
【问题描述】:

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

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

没有其他属性。

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

【问题讨论】:

标签: couchdb


【解决方案1】:

好的,知道了,如果有人感兴趣的话:

  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\'
    

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

【讨论】:

  • 你知道为什么在第 2 步我得到 - {"error"=>"conflict", "reason"=>"Document update conflict."} 吗?
  • 这非常有用 - 感谢您提供清晰的分步说明。其中大部分可以通过 Futon 完成,但您确实需要通过 CLI 运行几个步骤。不幸的是,这没有被广泛记录。
  • 不适合我,上面写着{"error":"not_found","reason":"missing"},如何获取所有修订数据
  • 我收到{"error":"forbidden","reason":"Usernames can not be changed."} : (
  • 这是一个很好的捷径:docs.couchdb.org/en/stable/api/document/… 详情见我的回答
【解决方案2】:

刚刚从 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) 现在通过$db/$id?rev=$preDeleteRevisionNumber 收集原始(预删除数据)

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

希望这对某人有所帮助。

【讨论】:

  • 我知道这是一个非常古老的线程,但如果您要求它,您可以获得有效的 JSON。例如,使用 curl:curl -H 'Accept: application/json' 'http://127.0.0.1:5984/$db/$id?revs=true&open_revs=all.
  • 五岁,但仍然是最佳答案。请注意,如果您使用的是 PouchDB,则响应会以 JSON 格式返回。
【解决方案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-02-19
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多