Вопрос по – Получить только что удаленный документ

21

Я удалил документ, но все еще вижу его в_changesтак что я могу видеть последний действительный_rev, который удален, так что получите документ с идентификатором и последняя ревизия просто возвращает:

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

и никаких других атрибутов.

Как я могу восстановиться в этой ситуации? Предыдущая ревизия не видна в_changes, Будет ли писать пустой документ (настройка_deleted вfalse) помогите увидеть все ревизии инфо?

Исходя из этого вопроса должно быть возможно:stackoverflow.com/questions/4738522/… avalez

Ваш Ответ

3   ответа
8

Сообщение в блоге о восстановлении документов CouchDB

У меня есть статья об этом. Надеюсь, кому-то это может пригодиться из-за более подробного описания вещей и более дружественной ориентации юниоров Приветствия.

13

после небольшой помощи добрых людей на couchdb irc.

1) запрос на получение$db/$id?revs=true&open_revs=all где$db ваше имя базы данных и$id это идентификатор документа, который вы удалили.

2) Очистить ответ. Как ни странно, результат этого запроса не был действительным и требовал очистки. У меня сработало следующее:

вар удаленоDoc =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 и добавьте ее с помощью _revisions.start - 1 и символа & quot; персонаж. Это дает вам номер версии документа непосредственно перед его удалением.

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

4) Теперь соберите оригинал (данные предустановки), чтобы получить$db/$id?rev=$preDeleteRevisionNumber

5) Чтобы перезаписать старую удаленную запись, вы должны опубликовать или вернуть документ с правильным идентификатором и последним номером редакции (не номер редакции перед удалением, а номер редакции, в которой документ был удален).

Надеюсь, это кому-нибудь поможет.

Пять лет, но все равно лучший ответ. Обратите внимание, что если вы используете PouchDB, ответ возвращается как JSON.
Я знаю, что это действительно старый поток, но вы можете получить действительный JSON, если попросите об этом. Например, используя curl:curl -H 'Accept: application/json' 'http://127.0.0.1:5984/$db/$id?revs=true&open_revs=all.
43

get deleted history, e.g.:

curl http://example.iriscouch.com/test/_changes

you'll see deleted documents with $id and $rev, put empty document as new version, e.g.:

curl -X PUT http://example.iriscouch.com/test/$id?rev=$rev -H "Content-Type: application/json" -d {}

now you can get all revisions info, e.g:

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

obtain version before deletion, e.g.:

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

put it back to couchdb, e.g.:

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

Дайте мне знать, если у вас есть лучший способ или сценарий.

Это было чрезвычайно полезно - спасибо за четкие, пошаговые инструкции. Большая часть этого может быть сделана через Futon, но есть несколько шагов, которые вам действительно нужно выполнить через CLI. К сожалению, это широко не задокументировано.
Это здорово, я мечтал об этом, спасибо, что поделились :) avalez
Знаете ли вы, почему на шаге 2 я получаю - {"error" = & gt; "конфликт", "quot; причина" = & gt; "конфликт обновления документа. & Quot;}?
Это только помогло мне восстановить вид. Хорошее объяснение!
Спасибо. Я реализовал эту стратегию восстановления с помощью следующего сценария Ruby:gist.github.com/vjt/6158675, Ты спас мне часы работы, я должен тебе Граппу. :-)

Похожие вопросы