Muchas preguntas surgen en el foro de Couchbase y Stack Overflow con respecto a leer y escribir sólo partes de un documento en lugar del documento completo. Puedo ver donde esto podría ser una preocupación. Por ejemplo, ¿qué pasa si tienes documentos que son megabytes de tamaño? Transferir estos grandes documentos entre la capa de aplicación y el servidor Couchbase puede llegar a ser bastante lento.
Aquí es donde la API de subdocumentos de Couchbase, parte de Servidor Couchbase 4.5, entra en juego. En lugar de obtener un documento completo y potencialmente grande basado en una clave, puedes obtener sólo las partes del documento que necesitas. Lo mismo puede decirse de escribir cambios de nuevo en Couchbase. Por ejemplo, ¿qué pasa si tienes un documento con datos de perfil de usuario y sólo necesitas cambiar la dirección? ¿No tendría más sentido escribir sólo ese cambio?
Vamos a echar un vistazo al uso de la API de sub-documentos en una aplicación Node.js usando el SDK de Node.js para Couchbase. Antes de empezar, vamos a inventarnos una historia. Digamos que tenemos un perfil de usuario con datos de redes sociales. Vamos a basar nuestras manipulaciones sólo en los datos de las redes sociales, no en el resto del documento. Así, por ejemplo:
1 2 3 4 5 6 7 8 9 |
{ firstName: "Nic", apellido: "Raboy", redes sociales: { twitter: "nraboy" } } |
El documento JSON anterior será el documento base con el que trabajaremos.
Para mantener las cosas fáciles de entender, vamos a crear un nuevo proyecto Node.js con el que trabajar. Construiremos sobre este nuevo proyecto para mayor claridad. Asumiendo que Node.js está instalado y que tienes Couchbase Server 4.5+ corriendo en algún lado, ejecuta lo siguiente desde tu Command Prompt o Terminal:
1 2 3 4 |
npm init -y npm instale couchbase --guardar |
Probablemente deberías crear un nuevo directorio antes de ejecutar los comandos anteriores, pero esencialmente crearán un nuevo proyecto Node.js e instalarán el SDK Node.js de Couchbase. Crea un app.js en el mismo directorio que albergará nuestra lógica.
En el futuro vamos a dedicar nuestro tiempo a la app.js archivo. Ábrelo y vamos a añadir el código de arranque básico para conectar con Couchbase.
1 2 3 4 5 6 |
var Couchbase = requiere("couchbase"); var grupo = nuevo Couchbase.Grupo("couchbase://localhost"); var cubo = grupo.openBucket("por defecto"); |
En el ejemplo anterior, nos estamos conectando a una instancia de Couchbase que se ejecuta localmente y estamos abriendo el archivo por defecto cubo. Siéntase libre de cambiar esto como sea apropiado. Ahora vamos a proceder a crear las siguientes cuatro funciones JavaScript:
1 2 3 4 5 6 |
var crearDocumento = función(documentId, documento) { } var getSubDocument = función(documentId) { } var upsertSubDocument = función(documentId) { } var getDocument = función(documentId, isFinished) { } |
Estamos creando cuatro funciones para evitar una gigantesca cadena anidada de callbacks de funciones asíncronas. Dado que nuestro proyecto será diseñado más como un script, una cadena puede ser un poco difícil de seguir.
Vayamos por orden con cada una de estas funciones. Empezando por la función crearDocumento será algo parecido a esto:
1 2 3 4 5 6 7 8 9 10 |
var crearDocumento = función(documentId, documento) { cubo.upsert(documentId, documento, (error, resultado) => { si(error) { devolver consola.registro("ERROR: ", error); } getSubDocument(documentId); }); } |
La función anterior asume que estamos pasando una clave de documento y un documento JSON. No te preocupes, lo veremos al final. Lo que ocurre es que estamos haciendo un upsert para crear un nuevo documento completo. Nosotros're esencialmente utilizando esta función como nuestra función de inicialización para este ejemplo. Cuando se crea el documento de perfil completo, llamará a la siguiente función cuando tenga éxito. Esta siguiente función es la getSubDocument y tiene el siguiente aspecto:
1 2 3 4 5 6 7 8 9 10 |
var getSubDocument = función(documentId) { cubo.buscarEn(documentId).consiga("redes sociales).ejecutar((error, resultado) => { si(error) { tirar error; } upsertSubDocument(documentId); }); } |
La función anterior tomará la clave de documento inicial que definamos y declarará que vamos a hacer una búsqueda en lugar de obtener un documento. Al hacer la búsqueda, buscamos el elemento redes sociales entonces ejecutamos esta búsqueda. Podemos obtener más de una propiedad si queremos, porque el resultado de la ejecución devolverá un array de propiedades. Por ejemplo, el array del contenido del resultado anterior tendría este aspecto:
1 2 3 |
[ { id: 0, valor: { twitter: 'nraboy' }, ruta: 'redes sociales' } ] |
Después del getSubDocument se completa con éxito, llama a la función upsertSubDocument que nos permite cambiar una parte del documento sin obtener primero el documento completo, o incluso parte de él.
1 2 3 4 5 6 7 8 9 10 |
var upsertSubDocument = función(documentId) { cubo.mutateIn(documentId, 0, 0).upsert("socialNetworking.website", "thepolyglotdeveloper.com", verdadero).ejecutar((error, resultado) => { si(error) { tirar error; } getDocument(documentId); }); } |
Seamos claros. Cuando utilizamos el mutateIn anterior, no estamos obteniendo primero el documento. Actúa como el lookup que hicimos antes. Le estamos diciendo a Couchbase qué documento planeamos cambiar basándonos en la clave, y luego estamos insertando una propiedad en particular. En el ejemplo anterior, estamos intentando crear una nueva propiedad llamada sitio web. Es una propiedad anidada por lo que estamos pasando la ruta completa junto con el valor de dicha propiedad. Entonces podemos ejecutar la petición.
Por último, queremos ver el documento completo que nos queda. Suponiendo que la mutación haya tenido éxito, el getDocument será llamada. Tendrá el siguiente aspecto:
1 2 3 4 5 6 7 8 9 10 |
var getDocument = función(documentId) { cubo.consiga(documentId, (error, resultado) => { si(error) { tirar error; } consola.registro(resultado); }); } |
En la función anterior sólo estamos haciendo un estándar consiga por clave de documento. Para terminar, probablemente sea una buena idea compartir el trozo de código que llamó a nuestra primera función. Se puede ver de la siguiente manera:
1 2 3 4 5 6 7 8 9 |
crearDocumento("nraboy", { firstName: "Nic", apellido: "Raboy", redes sociales: { twitter: "nraboy" } }); |
Conclusión
La API de sub-documento de Couchbase es increíblemente beneficiosa cuando se trabaja con documentos más grandes. No sólo puedes obtener trozos de un documento para reducir el tamaño de transferencia, sino que también puedes escribir trozos. He compartido sólo algo de lo que puedes hacer con la API para Node.js. Para ver otro ejemplo, visite este en GitHub. Se pueden ver más comandos en el SDK de Node.js documentación.