2012-05-01 31 views
22

Quiero eliminar todos los documentos donde foo es igual a x. Parece una operación bastante básica, pero no puedo resolverlo.¿Cómo puedo eliminar varios documentos en CouchDB?

Sé cómo eliminar un documento individual, pero eso no es suficiente, es posible que tenga que eliminar algunos miles a la vez.

¿Cómo puedo eliminar documentos a granel en CouchDB?

Respuesta

9

No sé si es la forma correcta pero visualice que expone el campo foo, consulte la vista para doc._id s de todos los documentos que desea eliminar y realice una actualización masiva de todos sus documentos . Entonces dos (idealmente) llamadas a sofá.

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

tiene una forma similar a ir sobre ella.

hacer una actualización mayor en todos los documentos que desea borrar y actualizar doc._deleted=true siguiendo el ejemplo de Bulk deletion of documents

+5

OK, así que en base a su enlace, y algunos otros artículos que he leído en el ínterin, parece que hacer un mayor de un solo paso borrar (o actualización) es imposible. Parece bastante sorprendente que algo que se llama a sí mismo una "base de datos" no tenga esta característica, pero al menos ahora conozco la forma menos ineficiente de obtener lo que quiero. Gracias por la información. –

+11

Es cierto. La definición de "base de datos" está cambiando. La gente solía llamar a Memcache un "caché" y ahora se considera una "base de datos en memoria". Estoy de acuerdo en que es desconcertante. Pero, por otro lado, la antigua definición realmente significaba "base de datos SQL", que tampoco era correcta. – JasonSmith

+0

realmente triste que no hay una manera más conveniente ...: '( –

2

También necesitaba algo para manejar eso y, ya que no había nada en ese momento, decidí hacer mi propia implementación.

Se puede encontrar here.

actualización

Desde que era muy útil para mí y para protegerme de errores, he añadido una copia de seguridad/restaurar la función de esta herramienta que ahora se pueden encontrar en versión 0.2

+0

Muy útil, muchas gracias por esta herramienta – JoCuTo

0

Intenté un método algo largo para borrar documentos. Primero creé una vista llamada map_fun que llamaba a los documentos que quería eliminar. entonces iterado a través de la vista y se almacenan las llaves del extienda al conjunto de documentos y acostumbrado del [ 'id _'] db para eliminarlos

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

Es muy fácil con mayor borrar: https://wiki.apache.org/couchdb/HTTP_Bulk_Document_API poste justo a _all_docs una lista de JSONs que se parecen:

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

No, eso no responde a la pregunta. Yo quería el equivalente a algo así como 'DELETE FROM t WHERE foo = 10'. Usando las operaciones masivas, me gustaría Todavía tengo que hacer dos llamadas, no una. –

Cuestiones relacionadas