Получить только что удаленный документ
Я удалил документ, но я все еще вижу его в _changes
, поэтому я могу увидеть последний допустимый _rev
, который удаляется, поэтому возвращает doc с идентификатором и последней версией:
{
"_id":"25efa4ec8489d8b89b34c5cad6000059",
"_rev":"3-a982bd6dccce8f405433f8453ab86880",
"_deleted":true
}
и никаких других атрибутов.
Как я могу восстановиться в этой ситуации? Предыдущую ревизию нельзя увидеть в _changes
. Будет ли писать пустой документ (установка _deleted
в false
), чтобы просмотреть все сведения о версиях?
Ответы
Ответ 1
Хорошо, понял, если кому интересно:
-
получить удаленную историю, например:
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\'
Сообщите мне, если у вас есть лучший способ, или script.
Ответ 2
Просто восстановление удаленных данных с couchdb. Вот как я решил это после небольшой помощи от добрых людей на couchdb irc.
1) Получить запрос $db/$id?revs=true&open_revs=all
, где $db
- ваше имя базы данных, а $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 и добавьте его с _revisions.start-1 и символом "-". Это дает вам идентификатор документа документа перед его удалением.
var preDeleteRevisionNumber = (deletedDoc._revisions.start - 1) + "-"+ deletedDoc._revisions.ids[1];
4) Теперь соберите исходные данные (данные перед собой) с помощью команды get to $db/$id?rev=$preDeleteRevisionNumber
5) Чтобы перезаписать старую удаленную запись, вы должны отправить или вернуть документ с правильным идентификатором и последним номером ревизии (а не номером ревизии предварительного удаления, а номером ревизии, который теперь у него был удален).
Надеюсь, это поможет кому-то.
Ответ 3
Сообщение в блоге об удалении документов CouchDB
У меня есть статья об этом. Надеюсь, кто-то может найти это полезным из-за более подробного описания вещей и более дружественной ориентации юниоров. Приветствия.