2012-06-01 3 views
20

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

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

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

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

+0

Исходя из этого вопроса, это должно быть возможно: http://stackoverflow.com/questions/4738522/couchdb-change-notifications – avalez

ответ

38

Ок, понял это, если кому интересно:

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

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

+1

Спасибо. Я реализовал эту стратегию восстановления с помощью следующего скрипта Ruby: https://gist.github.com/vjt/6158675. Вы спасли мне часы работы, я должен вам Граппа. :-) – vjt

+0

Отлично, я мечтал об этом, спасибо за обмен :) – avalez

+2

Знаете ли вы, почему на шаге 2 я получаю - {"error" => "конфликт", "причина" => "Конфликт обновления документа". }? – vladCovaliov

9

Только что восстановил удаленные данные с couchdb. Вот как я решил это после небольшой помощи от добрых людей на couchdb irc.

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

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

вар 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 и добавьте его с _revisions.start-1 и символом «-». Это дает вам идентификатор документа документа перед его удалением.

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

4) Теперь собирать исходный (PREDELETE данные) с добраться до $db/$id?rev=$preDeleteRevisionNumber

5) Для того, чтобы перезаписать старые удаленные записи, вы должны размещать или положить обратно документ с правильным идентификатором и последним номер ревизии (а не номер версии предварительного удаления, но номер версии, с которой документ теперь был удален).

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

+1

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

8

Blog post about undeleting CouchDB documents

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

Смежные вопросы