
N1QL + Go + JSON Marshaling
Desarrollado por Couchbase para su uso con Couchbase Server, N1QL proporciona un lenguaje de consulta común y un modelo de datos basado en JSON para bases de datos distribuidas orientadas a documentos. N1QL es un lenguaje de consulta potente y expresivo. Entre las numerosas ventajas que ofrece N1QL, permite al desarrollador una rica experiencia de consulta ad hoc. En Go, es más fácil interactuar con JSON cuando el esquema/estructura del documento se conoce de antemano-¿qué ocurre cuando las consultas se construyen dinámicamente dentro de la aplicación, en tiempo de ejecución? ¿Qué ocurre si los resultados no están fuertemente tipados en un esquema bien definido? ¿Cuáles son las estrategias para interactuar con una estructura JSON desconocida en Go? Respondamos a estas preguntas examinando tres patrones de uso comunes para emitir consultas con N1QL en Couchbase.
Configuración
En código para este blog, junto con varios otros ejemplos útiles se pueden encontrar en nuestra guía del desarrollador repositorio en github. Para cada uno de los tres ejemplos discutidos en este blog, usaremos el bucket travel-sample en Couchbase, y el Go SDK. El conjunto de datos travel-sample viene de serie con cada instancia de Couchbase. Contiene una amplia colección de aeropuertos, aerolíneas, vuelos y puntos de interés en documentos JSON que son ideales para crear prototipos de aplicaciones. Si has instalado Couchbase en tu máquina de desarrollo y no tienes configurado el bucket travel-sample, no pasa nada. Es muy fácil cargarlo cada vez que quieras usarlo. Desde la interfaz de administración, haz clic en la pestaña "settings"->"sample buckets" y marca la casilla "travel-sample". Además, tendremos que instalar el Go SDK, que puede ser referenciado en su aplicación go en la sección de importación por: "github.com/couchbase/gocb". ¡Eso es todo!
La consulta
Para mostrar la potencia y flexibilidad de Couchbase y el lenguaje de consulta N1QL, vamos a utilizar una consulta intencionadamente ambigua y abierta. Vamos a recuperar cualquier documento que tenga un aeropuerto o nombre que contenga una cadena de caracteres específica.
Arrancar la aplicación
Para empezar, primero vamos a configurar las dependencias y la conexión a Couchbase. Necesitamos construir una simple API REST a la que podamos enviar comandos curl para peticiones http, exactamente como lo haría un framework web javascript. Go incluye un gran paquete para hacer esto: "net/http".
Recuerda, siempre instanciar Couchbase una vez en tu aplicación y usarlo como referencia en toda tu aplicación. Esto permite a Couchbase operar asíncronamente mientras ahorra tiempo al no tener que crear/descomponer nuevas conexiones al cluster cada vez. Esto también asegura que tu aplicación será consciente de cualquier cambio en la topología a medida que ocurren. Nuestra función principal con la conexión a Couchbase y los manejadores de peticiones se construye de la siguiente manera:
Caso 1 fuertemente tipificado (¡sé lo que busco!)
En un mundo perfecto, donde sabemos exactamente lo que los usuarios van a consultar, y sabemos que lo van a hacer de una manera muy estructurada podemos configurar un esquema estricto en el que nuestros resultados se pueden plegar. Primero configuramos un struct:
La belleza de JSON en Go es que está soportado de forma nativa, al igual que Couchbase. No importa cuál sea la estructura de los documentos JSON devueltos por la consulta, podemos "filtrar" para un esquema estricto utilizado por la aplicación iterando a través de los resultados. A medida que iteramos, si el documento resultante actual coincide con lo definido en nuestra estructura JSON, se añadirá al array de documentos devueltos. Otros campos superfluos son ignorados.
A continuación, la matriz se transforma en JSON y se devuelve como respuesta. Si enviamos una solicitud a nuestra api para todos los aeropuertos con Portland en el título: curl https://localhost:3000/api/query/typed?search=Portland obtendremos una matriz de documentos JSON fuertemente tipados/definidos en la respuesta:
Caso 2 Untyped (no estoy exactamente seguro, ¡dame todo!)
Por desgracia, no todo encaja en esquemas explícitos y estructuras fuertemente tipadas. A veces es necesario realizar una consulta que devuelva una amplia gama de documentos con diferentes esquemas. Consideremos la misma consulta, pero supongamos que nuestro front-end quiere encontrar cualquier aeropuerto, aerolínea o punto de interés con Portland en el nombre. La flexibilidad de Go significa que podemos iterar a través de los resultados de la consulta y transmitir cada documento a una matriz de variables de interfaz. No necesitamos conocer el esquema de antemano.
La mezcla resultante de esquemas divergentes se marhsala y se devuelve en la respuesta. Si enviamos una solicitud a nuestra api curl https://localhost:3000/api/query/untyped?search=Portland se devuelve en la respuesta un conjunto diverso de esquemas diferentes.
Caso 3 Recuperar uno (¡Sólo quiero recuperar el primero!)
Tomemos el último ejemplo y simplifiquémoslo: devolvamos el primer elemento de los resultados de la consulta. El Go sdk tiene un método para que en N1QL, ".One()"
Cuando enviamos una solicitud a https://localhost:3000/api/query/one?search=Portland, podemos comprobar que sólo se devuelve un resultado en la respuesta
¿Y ahora qué?
La combinación de Couchbase, N1QL y Go es un entorno increíblemente eficiente y racionalizado que es perfecto para construir tu próxima aplicación Go. Hay un montón de ejemplos en la guía para desarrolladores, y mucha información sobre cómo empezar en el sitio web. Tweetéanos en @Couchbase: ¡cuéntanos qué estás haciendo con Couchbase y Go!