Una pregunta habitual que se plantea en el Foros de Couchbase y en Stack Overflow se explica cómo
eliminar todos los registros de un bucket que tengan una clave que empiece por algún valor. En otras palabras, cómo eliminar todos los registros que comparten una clave
clave compuesta concreta. La solución sencilla es crear una vista Couchbase y ejecutar una consulta de rango.
Puedes ejecutar consultas de rango con todos los SDKs de Couchbase, pero para este ejemplo en particular vamos a ver cómo hacerlo con Node.js.
Requisitos previos
Antes de intentar lo siguiente, debe tener instalado y configurado lo siguiente:
- Node.js y Node Package Manager (NPM) instalados
- Couchbase 3.0+
Nuestros datos de muestra
Para el resto de este ejemplo vamos a utilizar algunos documentos de muestra en un cubo que voy a llamar cubo de pruebas.
Los documentos de nuestro bucket tendrán los siguientes nombres clave:
- usuario::nraboy
- usuario::mingenthron
- usuario::blawson
- producto::1
- producto::2
- producto::3
El contenido de estos documentos no importa realmente para este ejemplo. Lo que importa es el prefijo que he decidido utilizar para cada uno de los documentos.
dos tipos de documentos. He elegido utilizar usuario:: para representar documentos de usuario y producto:: para representar
documentos de producto. Las claves completas representan claves compuestas.
Creación de nuestra vista Couchbase
Tenemos muchos documentos (no realmente) en nuestro bucket de Couchbase. Lo más probable es que no vamos a recordar todas las claves para hacer directa clave-valor
búsquedas. Por esta razón vamos a necesitar crear una Vista Couchbase.
Puedes crear Couchbase Views a través de código, pero para este ejemplo en particular vamos a crear una a través del Dashboard de Couchbase. Regístrate en
en el panel de control de Couchbase y haga clic en el botón Vistas y seleccione la pestaña cubo de pruebas que creó anteriormente.
Elija crear una nueva vista de desarrollo y llame al documento de diseño diseño/dev_docs con un nombre de vista
by_id. El código de la vista por defecto debería estar bien, pero por si acaso no lo está, querrás asegurarte de que la vista se parece a la
siguiente:
1 2 3 4 5 |
función (doc, meta) { emite(meta.id, null); } |
Esta vista emitirá todos los documentos y la clave será cada uno de los ids de los documentos.
Nuestra aplicación Node.js
En este punto vamos a crear una aplicación Node.js fresca para mantener las cosas fáciles de entender.
Preparación del proyecto
Utilizando su Terminal (Mac / Linux) o Símbolo del sistema (Windows), ejecute el siguiente comando:
1 2 3 |
npm init |
Responde a todas las preguntas y ya está. También puedes crear tu NPM paquete.json desde cero y
añada el siguiente contenido:
1 2 3 4 5 6 7 8 9 |
{ "nombre": "mass-delete-nodejs", "version": "1.0.0", "descripción": "Borrar todos los documentos prefijados con un valor determinado", "autor": "Couchbase, Inc.", "licencia": "MIT" } |
Aún no hemos terminado. Tenemos que instalar las dependencias del proyecto antes de que podamos empezar a planificar esto
aplicación. Desde el Símbolo del sistema o Terminal, ejecute el siguiente comando:
1 2 3 |
npm instale couchbase express --guardar |
Esto instalará Express Framework, y el SDK de Couchbase Node.js.
El código que importa
Si aún no lo ha hecho, cree un app.js que se encuentra junto a su paquete.json de su proyecto.
El contenido de este archivo debe ser el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
var express = requiere("express"); var couchbase = requiere("couchbase"); var aplicación = express(); var cubo = (nuevo couchbase.Grupo("http://127.0.0.1:8091")).openBucket("testbucket"); var ViewQuery = couchbase.ViewQuery; var consulta = ViewQuery.de('docs', by_id); consulta.gama("usuario::", "usuario::" + "u02ad", falso); cubo.consulta(consulta, función(error, resultados) { si(error) { devolver consola.registro(error); } consola.registro("Encontrado" + resultados.longitud + " documentos a eliminar"); para(i en resultados) { cubo.eliminar(resultados[i].id, función(error, resultado) { consola.registro("Borrar" + resultados[i].clave); }); } }); var servidor = aplicación.escuche(3000, función () { consola.registro("Escuchando en el puerto %s...", servidor.dirección().puerto); }); |
Aquí pasan muchas cosas, así que voy a desglosarlas.
1 2 3 4 5 |
var express = requiere("express"); var couchbase = requiere("couchbase"); var aplicación = express(); |
No hay mucho de lo que preocuparse por encima. Sólo estamos incluyendo el SDK de Couchbase y Express Framework para su uso en nuestra aplicación. Sin embargo, a continuación
verás que nos estamos conectando a nuestro cluster y abriendo un bucket en particular:
1 2 3 |
var cubo = (nuevo couchbase.Grupo("http://127.0.0.1:8091")).openBucket("testbucket"); |
Nos conectamos a una instancia de Couchbase alojada localmente y abrimos nuestra instancia de cubo de pruebas mencionado anteriormente.
¡Ahora vamos a ver algo genial!
1 2 3 4 5 6 |
var ViewQuery = couchbase.ViewQuery; var consulta = ViewQuery.de('docs', by_id); consulta.gama("usuario::", "usuario::" + "u02ad", falso); |
Estamos preparando un objeto ViewQuery a partir de nuestro diseño/dev_docs documento de diseño y by_id ver. Para consultar sólo
para determinados documentos vamos a utilizar lo que se denomina una consulta de rango. Ya sabemos que nuestra vista devuelve documentos con el valor
como valor clave. Esto significa que con una consulta de rango podemos determinar qué claves queremos recibir.
En la consulta de rango, la clave de inicio será usuario:: porque queremos borrar todos los documentos de usuario. La tecla final también
contienen usuario::pero tienen el carácter unicode u02ad que se le añade. Esto capturará todo
con el prefijo de lo que buscamos. Encontrará más información sobre este tipo de consulta de intervalos en la sección
documentación oficial de Couchbase.
Finalmente ejecutamos esta consulta y capturamos los resultados. Recorremos los resultados en bucle y borraremos cada registro uno a uno como se ve
en lo siguiente:
1 2 3 4 5 6 7 |
para(i en resultados) { cubo.eliminar(resultados[i].id, función(error, resultado) { consola.registro("Borrar" + resultados[i].clave); }); } |
Cada borrado emitido en Node.js será no-bloqueante para que la capa de aplicación no se bloquee. Cuando una petición de borrado llega a Couchbase Server,
el documento se marca para su eliminación y se borra posteriormente cuando se produce la compactación.
1 2 3 |
nodo aplicación.js |
Ejecute la línea anterior para ver este proyecto en acción.
Conclusión
Con las consultas de rango puede consultar documentos concretos de una vista y, a continuación, optar por eliminarlos. Los documentos concretos de este ejemplo son
tenían claves compuestas prefijadas con usuario:: en la llave.
¿Se puede hacer esto también con Couchbase server 2.5 y java client 1.4?
Sí, este concepto debería funcionar allí también, la vista debería ser la misma, pero el código java será obviamente diferente al anterior.
Otra opción que siempre recomiendo a la gente dependiendo de lo pronto que necesiten borrar cosas y la carga que puedan poner en su cluster Couchbase es en vez de borrar el objeto directamente, poner un TTL aleatorio en cada uno de los objetos entre ahora y X días a partir de ahora. Entonces el cluster de Couchbase se encargará de borrar el objeto del bucket cuando el TTL expire con una menor carga en el cluster.