2011-06-20 9 views
11

Tengo el problema de que me gusta "automágicamente" eliminar documentos en mi sofá, que tienen al menos 6 meses de antigüedad. Mi instancia de CouchDb se ejecuta en un servidor Linux, ¿hay alguna forma de lograr esto bastante simple (como escribir un sencillo script de 2 líneas)?CouchDb: ¿cómo eliminar documentos anteriores> 6 meses?

+0

He actualizado mi publicación. Espero que lo ayude –

+5

V-Light tiene razón en que no puede hacer esto sin antes tener (1) marcas de tiempo en todos sus documentos, y (2) consultas preparadas para buscar por marca de tiempo. Sin embargo, una vez/si tienes eso, uso 'jss' para el trabajo único de Couch a granel. Básicamente: 'curl --silent $ some_query | jss - '{_id: $ ._ id, _rev: $ ._ rev, _deleted: true}' --bulk-docs | curl --silent $ some_db/_bulk_dos' – JasonSmith

+3

Dado que es muy difícil de encontrar con google, aquí está el enlace a jss: https://github.com/iriscouch/jss –

Respuesta

7

se puede escribir una función de actualización en couchdb que elimina un documento de ciertos criterios (se puede utilizar params al llamar a la función): http://wiki.apache.org/couchdb/Document_Update_Handlers#Creating_an_Update_Handler

(observe "en el lugar" e imagine la configuración "_delete: true").

algo así como

"deletefunc": 
... 
if(doc.created_at<req.query.mindate) { 
    doc._deleted:true; 
    return [doc, "deleted"] 
} 

y llamando ... db/_Diseño/updatefuncdesigndoc/_update/deletefunc/dok_id_x MinDate = 20110816

El único trabajo es:? Llamando a cada documento en una base de datos explícita con esta función (llamando _all_docs o _changes primero)

+0

Gracias. La función de actualización era lo que estaba buscando. –

5

Por lo que sé, CouchDB almacena cada base de datos (con todos los documentos) en un solo archivo (). Por lo tanto, no podrá encontrar un documento específico por su nombre o fecha de adición.

ACTUALIZACIÓN:

creo que la única manera sería añadir un campo "_doc_created" (o "_doc_established") a cada documento, con una marca de tiempo (similitud con LSQ NOW()). A continuación, cree una vista que muestre solo documentos IDs y valores de los campos "_doc_created":

e.G.

function(doc) { 
    emit(doc._doc_created, doc._id); 
    //or just emit(doc._doc_created) 'couse views alsways return docIDs 
} 

y luego escribir un guión (por ejemplo, un script de shell ), que se lleva todos estos identificadores y fechas (a través de rizo), lo filtra y después (una vez más a través de rizo) Elimina todos los documentos de base de datos que _doc_crated de fecha y hora es mayor de 6 meses a partir de ahora

+2

+1. A diferencia de la mayoría de los sistemas de archivos y sistemas como RoR, CouchDB no requiere ni sugiere que conserve marcas de tiempo en sus datos. Eso es desafortunado, porque las aplicaciones exitosas (es decir, aquellas que "viven" meses o años) casi siempre necesitan esa información más adelante. Como plantar un árbol, ahora es el mejor momento para limpiar datos. Como CouchDB está relajado, puede agregar marcas de tiempo a sus registros según sea necesario y consultarlos y eliminarlos según sea necesario. – JasonSmith

+2

Si bien el enfoque de agregar una marca de tiempo es bueno, el enfoque sugerido para ejecutar el 'script de purga' es un enfoque bastante complejo. Vea la 'función de actualización en couchdb' para un enfoque que es más simple y aprovecha las características apropiadas de couchdb. – Jay

Cuestiones relacionadas