Подтвердить что ты не робот

Удалите все документы в базе данных CouchDB * кроме * проектных документов

Можно ли удалить все документы в базе данных couchdb, кроме проектных документов, без создания для этого определенного вида?

Мой первый подход заключался в доступе к стандартным представлениям _all_docs и отбрасыванию этих документов, начиная с _design. Это работает, но для больших баз данных слишком медленно, так как документы необходимо запрашивать из базы данных (чтобы получить пересмотр документа) по одному за раз.

Если это единственный действительный подход, я думаю, что гораздо практичнее удалить полную базу данных и создать его с нуля, вставив документы дизайна снова.

4b9b3361

Ответ 1

Я могу придумать пару идей.

Использовать _all_docs

Вам не нужно брать все документы, только идентификатор и изменения. По умолчанию это все, что возвращает _all_docs. Вы можете сделать довольно большой запрос в пакете (документы 10k или 100k в то время должны быть точными).

Повторить, а затем удалить

Вы можете использовать запрос _all_docs для получения идентификаторов всех проектных документов.

GET /db/_all_docs?startkey="_design/"&endkey="_design0"

Затем скопируйте их где-нибудь временными.

POST /_replicator

{ "source":"db", "target":"db_ddocs", "create_target":true
, "user_ctx": {"roles":["_admin"]}
, "doc_ids": ["_design/ddoc_1", "_design/ddoc_2", "etc..."]
}

Теперь вы можете просто удалить исходную базу данных и скопировать временную копию, заменив значения "source" и "target".

Удаление vs "удаление"

Обратите внимание, что это действительно методы яблок и апельсинов. Удалив базу данных, вы удаляете историю изменений всех ее документов. Другими словами, вы не можете реплицировать эти события удаления в любую другую базу данных. Когда вы удаляете документ в CouchDB, он сохраняет запись об этом дележе. Если вы копируете эту базу данных, эти удаления будут отражены в целевом объекте. (CouchDB хранит "надгробные плиты", указывающие идентификатор документа, его историю изменений и его удаленное состояние.)

Это может быть или не быть важно для вас. Первая идея, вероятно, считается более "правильной", однако я вижу значение второго. Вы можете визуализировать всю программу, чтобы выполнить это в своей голове. Это всего несколько запросов, и все готово. Нет циклов в _all_docs партиях, без головной боли. Ваша конкретная ситуация, вероятно, сделает очевидным, что лучше.

Ответ 2

Вы можете написать оболочку script, которая просматривает список всех документов и удаляет их по одному за исключением документов проекта. По-видимому couch-batch может это сделать. Обратите внимание, что вам не нужно извлекать все документы для этого, просто идентификатор и ревизию.

Кроме этого, я думаю, отфильтрованная репликация (или репликация, предложенная JasonSmith) - ваш лучший выбор.

Ответ 3

Установите couchapp, вытащите проект doc на свой жесткий диск, удалите db в futon, подтолкните doc проекта обратно к вашей воссозданной базе данных. =)