2012-05-01 30 views
22

Chcę usunąć wszystkie dokumenty, w których foo jest równy x. Wydaje się to całkiem podstawową operacją, ale po prostu nie mogę tego rozgryźć.Jak mogę usunąć wiele dokumentów w CouchDB?

Wiem, jak usunąć pojedynczy dokument, ale to nie wystarczy - być może trzeba będzie usunąć kilka tysięcy na raz.

Jak zbiorczo usuwać dokumenty w CouchDB?

Odpowiedz

9

Nie wiem, czy jest to właściwy sposób, ale zrób widok, który eksponuje pole foo, przeszukaj widok dla wszystkich dokumentów, które chcesz usunąć, i utwórz zbiorczą aktualizację dla wszystkich swoich dokumentów . Tak więc dwa (idealnie) połączenia z kanapą.

http://comments.gmane.org/gmane.comp.db.couchdb.user/11222

ma podobny sposób się do tego zabrać.

Czy zbiorczego aktualizacji na wszystkich dokumentach, które chcesz usunąć, a następnie aktualizować doc._deleted=true wzorując się na Bulk deletion of documents

+5

OK, więc na podstawie Twojego linku i kilku innych artykułów, które przeczytałem w międzyczasie, wydaje się, że wykonanie jednoetapowego zbiorczego usuwania (lub aktualizacji) jest niemożliwe. Wydaje się dość szokujące, że coś, co nazywa się "bazą danych", nie miałoby tej funkcji, ale przynajmniej teraz znam najmniej nieskuteczny sposób, aby uzyskać to, czego chcę. Dzięki za informację. –

+11

To prawda. Definicja "bazy danych" się zmienia. Ludzie zwykli nazywać memcache "pamięcią podręczną", a teraz jest ona uważana za "bazę danych w pamięci". Zgadzam się, że to niepokojące. Ale z drugiej strony, stara definicja naprawdę oznaczała "bazę danych SQL", która również nie była poprawna. – JasonSmith

+0

Naprawdę smutno, nie ma wygodniejszego sposobu ...: '( –

2

Musiałem także coś z tym poradzić, a ponieważ nie było nic w tym czasie, postanowiłem zrobić mój własna realizacja.

Można go znaleźć here.

Aktualizacja

Ponieważ było bardzo pomocne dla mnie i aby zabezpieczyć się przed błędami, dodałem kopii zapasowej/przywracania funkcji do tego narzędzia, które można teraz znaleźć na wersja 0.2

+0

Bardzo przydatne, bardzo dziękuję za to narzędzie – JoCuTo

0

Próbowałem nieco długą metodę usuwania dokumentów. Najpierw utworzyłem widok o nazwie map_fun, który nazwał dokumenty, które chciałem usunąć. I następnie powtórzyć w widoku i przechowuje klucze allt on dokumenty i stosować del db [ „_ id”], aby usunąć je

map_fun = '''function(doc){ 
    if (doc.doc_type == 'classic'){ 
    emit(doc._id, doc) 
    }}''' 

deldoclist = [] 
for row in db.query(map_fun): 
    deldoclist.append(row.key) 

for item in deldoclist: 
    del db[item] 
0

Jest to dość proste z luzem usunąć: https://wiki.apache.org/couchdb/HTTP_Bulk_Document_API Wystarczy POST do _all_docs listę JSONs które wyglądają tak:

{"_id": "0", "_rev": "1-62657917", "_deleted": true} 
+0

Nie, to nie odpowiada na pytanie.Chciałem odpowiednika czegoś takiego jak "USUŃ Z T WHERE foo = 10". nadal muszą wykonywać dwa połączenia, a nie jedno. –

Powiązane problemy