Supprimer tous les documents D'une base de données CouchDB * sauf * les documents de conception

Est-il possible de supprimer tous les documents dans une base de données couchdb, sauf documents de conception, sans créer une vue spécifique pour cela?

Ma première approche a été d'accéder à l' _all_docs affichage standard, et de jeter ces documents en commençant par _design. Cela fonctionne, mais, pour les grandes bases de données, est trop lent, car les documents doivent être demandés à partir de la base de données (en vue d'obtenir la révision du document).

si c'est le seul valide approche, je pense qu'il est beaucoup plus pratique de supprimer la base de données complète, et de la créer à partir de zéro insertion des documents de conception à nouveau.

18
demandé sur dangonfast 2012-04-14 21:04:46

3 réponses

je ne peux penser à un couple d'idées.

Utiliser _all_docs

Vous n'avez pas besoin de chercher tous les documents, seulement L'ID et les révisions. Par défaut, c'est tout ce que _all_docs renvoie. Vous pouvez faire une demande assez grande dans un lot (10k ou 100k docs à la fois devrait être très bien).

répliquer puis supprimer

vous pourriez utiliser un _all_docs requête pour obtenir les ID de tous les documents de conception.

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

puis les répliquer quelque part temporaires.

POST /_replicator

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

maintenant vous pouvez simplement supprimer la base de données originale et répliquer celle temporaire en remplaçant le "source" et "target" valeurs.

Supprimer vs "supprimer"

Remarque, ce sont vraiment des pommes contre des oranges techniques. Par la suppression d'un base de données, vous effacez l'historique d'édition de tous ses documents. En d'autres termes, vous ne pouvez pas répliquer ces événements de suppression à n'importe quelle autre base de données. Lorsque vous "supprimez" un document dans CouchDB, il stocke un enregistrement de cette suppression. Si vous répliquez cette base de données, ces suppressions seront reflétées dans la cible. (CouchDB stocke des "pierres tombales" indiquant L'ID du document, son historique de révision et son état supprimé.)

cela peut ou non être important pour vous. La première idée est probablement considérée comme plus "correcte" mais je peux voir la valeur de la seconde. Vous pouvez visualiser le programme entier pour accomplir ceci dans votre tête. Ce n'est que quelques questions et c'est fini. Pas de boucle à l'aide de _all_docs lots, pas de maux de tête. Votre situation particulière fera probablement ressortir ce qui est mieux.

14
répondu JasonSmith 2012-04-16 16:24:00

vous pouvez écrire un script shell qui passe en revue la liste de tous les documents et les efface tous un par un sauf design docs. Apparemment canapé-lot peut le faire. Notez que vous n'avez pas besoin de récupérer tous les docs pour faire cela, juste l'id et la révision.

Autre que cela, je pense que filtre de réplication (ou la réplication proposée par JasonSmith) est votre meilleur pari.

1
répondu Simon 2012-04-17 04:22:10

Installer couchapp, tirer vers le bas la conception de la doc sur votre disque dur, supprimer la db en futon, pousser la conception doc de retour jusqu'à votre recréé la base de données. =)

1
répondu Sudopriest 2015-08-06 18:49:16