La API de subdocumentos - go
Probablemente haya oído hablar del subdocumento (subdoc) API disponible en couchbase 4.5. Mark Nunberg, uno de los arquitectos de la nueva API, tiene un gran blog sobre la motivación y el ímpetu detrás de la ampliación de la api Memcached (clave-valor) para apoyar las operaciones Sub-Documento. Matthew Revell también reunió un gran muestra con Java y Python. Si eres como yo, quieres ver cualquier nueva característica expresada en tu(s) lenguaje(s) preferido(s). Para mí, eso significa go o nodejs. Veamos un ejemplo y cómo funciona la API en go.
Editar: Esta entrada de blog ha sido editada con las actualizaciones de la 4.5 Beta
Para conocer otras características de Couchbase 4.5, consulte las publicaciones del blog de Don Pinto sobre la versión Vista previa para desarrolladores y el Beta.
Empecemos con una estructura json sencilla, con tres campos
Crear un documento utilizando la estructura que hemos definido y "upsert" en couchbase
Ahora, vamos a añadir una matriz al documento que hemos creado en un nuevo campo, y luego realizar algunas operaciones adicionales en la matriz. Gracias a la magia de la API de subdocumentos, podemos hacer todo esto sin tener que recuperar o actualizar el documento completo. Esto ahorra tiempo y ancho de banda, y mejora drásticamente el rendimiento.
¿Qué acaba de pasar? ¡Necesito un constructor!
La api go para operaciones con subdocumentos añade dos nuevos métodos al tipo Bucket: Buscar en()
y MutarEn()
. Estas operaciones a nivel de bucket son consistentes en todos los SDKs de couchbase. Si estás usando go, nodejs, Java, .NET, C o Python todos funcionan de la misma manera. Esta es una buena conveniencia para la portabilidad de código, ya que rara vez vemos un entorno de producción con un solo lenguaje a través de la pila. Echemos un vistazo a lo que estos dos nuevos métodos en el tipo Bucket hacer bajo las cubiertas:
MutateIn
Veamos el MutateInBuilder, utilizado para combinar una o más operaciones de mutación en un único documento: func (b *Bucket) MutateIn(key string, cas Cas, expiry uint32) *MutateInBuilder
. Esta función incluye un método receptor para el tipo Bucket, y devuelve una referencia al MutateInBuilder
El MutateInBuilder tiene diez métodos:
- AddUnique():
func (set *MutateInBuilder) AddUnique(path cadena, value interfaz{}, createParents bool) *MutateInBuilder
Este método añade un valor único a un campo de matriz existente. Primero comprueba si el valor existe y luego lo actualiza. Devuelve una referencia aMutateInBuilder
- ArrayInsert():
func (set *MutateInBuilder) ArrayInsert(path string, value interface{}) *MutateInBuilder
Este método inserta un valor de matriz en un campo de matriz de un documento. NotaEn nuestro ejemplo anterior, pasamos una cadena que representa la matriz y el índice: "cuartoItem[2]". Devuelve una referencia a unMutateInBuilder
- Counter():
func (set *MutateInBuilder) Contador(path cadena, delta int64, createParents bool) *MutateInBuilder
Este método realiza una operación de contador atómico en un campo de un documento. Devuelve una referencia a unMutateInBuilder
- Insert():
func (set *MutateInBuilder) Insert(path cadena, value interfaz{}, createParents bool) *MutateInBuilder
Este método inserta un nuevo valor en una ubicación específica de un documento. Devuelve una referencia a unMutateInBuilder
- PushBack():
func (set *MutateInBuilder) PushBack(path string, value interface{}, createParents bool) *MutateInBuilder
Este método añade un nuevo valor al final de un campo de matriz dentro de un documento. Devuelve una referencia a unMutateInBuilder
- PushFront():
func (set *MutateInBuilder) PushFront(path cadena, value interfaz{}, createParents bool) *MutateInBuilder
Este método añade un nuevo valor al principio de un campo de matriz dentro de un documento. Devuelve una referencia a unMutateInBuilder
- Quitar():
func (set *MutateInBuilder) Eliminar(cadena de ruta) *MutateInBuilder
Este método elimina un valor de un campo específico de un documento. Devuelve una referencia a unMutateInBuilder
- Reemplazar():
func (set *MutateInBuilder) Replace(ruta cadena, valor interfaz{}) *MutateInBuilder
Este método sustituye un valor dentro de un campo de un documento. Devuelve una referencia a unMutateInBuilder
- Upsert():
func (set *MutateInBuilder) Upsert(path string, value interface{}, createParents bool) *MutateInBuilder
Este método añade o sustituye un campo dentro de un documento. Devuelve una referencia a un campoMutateInBuilder
- Ejecutar():
func (set *MutateInBuilder) Ejecutar() (*FragmentoDocumento, error)
Este método envía las operaciones encadenadas al servidor y devuelve un archivoDocumentoFragmento
con sus resultados.
El flujo lógico para MutarEn()
tiene este aspecto
BúsquedaEn
Echemos un vistazo al LookupInBuilder, que nos permite declarar una o varias operaciones de recuperación con alcance a un único documento: func (b *Bucket) LookupIn(cadena clave) *LookupInBuilder
. Esta función incluye un método receptor para el tipo Bucket, y devuelve una referencia al LookupInBuilder.
El LookupInBuilder tiene tres métodos:
- Get():
func (set *LookupInBuilder) Get(cadena de ruta) *LookupInBuilder
Este método solicita que se recupere el contenido de la ruta. Devuelve una referencia a unLookupInBuilder
- Exists():
func (set *LookupInBuilder) Existe(path string) *LookupInBuilder
Comprueba si existe la ruta proporcionada. Devuelve una referencia aLookupInBuilder
- Ejecutar():
func (set *LookupInBuilder) Ejecutar() (*DocumentFragment, error)
Este método envía los comandos encadenados al servidor y devuelve una referencia a un archivoDocumentoFragmento
(que contiene los resultados) y unerror
si se encuentra uno.
El flujo lógico para Buscar en()
tiene este aspecto
Próximos pasos
¿Por qué no lo prueba usted mismo? El ejemplo anterior, junto con varios otros ejemplos de go, se puede encontrar en nuestro repositorio de guías para desarrolladores en github Una gran manera de empezar y probar couchbase 4.5 (en beta en el momento de la publicación) es con docker. La imagen docker de couchbase 4.5 se puede cargar si tienes docker instalado con el siguiente comando:
docker run -d --name=CB45DP1 -p 8091-8093:8091-8094 -p 11207-11210:11207-11210 -p 18091-18092:18091-18092 couchbase/server:enterprise-4.5.0-Beta
Nos encantan los comentarios: pruébelo y díganos qué le parece.