
N1QL + Go + Marshalização de JSON
Desenvolvido pela Couchbase para uso com o Couchbase Server, N1QL fornece uma linguagem de consulta comum e um modelo de dados baseado em JSON para bancos de dados distribuídos orientados a documentos. O N1QL é uma linguagem de consulta avançada e expressiva. Entre os inúmeros benefícios que a N1QL oferece, ela permite que o desenvolvedor tenha uma experiência rica em consultas ad hoc. Em Go, é mais fácil interagir com JSON quando o esquema/estrutura do documento é conhecido antecipadamente. O que acontece quando as consultas são criadas dinamicamente no aplicativo, em tempo de execução? O que acontece se os resultados não forem fortemente tipados em um esquema bem definido? Quais são as estratégias para interagir com uma estrutura JSON desconhecida em Go? Vamos responder a essas perguntas examinando três padrões de uso comuns para a emissão de consultas com N1QL no Couchbase.
A configuração
O código para este blog, juntamente com vários outros exemplos úteis, pode ser encontrado em nosso guia do desenvolvedor repositório no github. Para cada um dos três exemplos discutidos neste blog, usaremos o bucket travel-sample no Couchbase e o Go SDK. O conjunto de dados travel-sample vem como padrão em todas as instâncias do Couchbase. Ele contém uma ampla coleção de documentos JSON de aeroportos, companhias aéreas, voos e pontos de interesse que são ótimos para criar protótipos de aplicativos. Se você instalou o Couchbase em sua máquina de desenvolvimento e não tem o bucket travel-sample configurado, não tem problema. É muito fácil carregá-lo sempre que você quiser usá-lo. Na interface do usuário do administrador, basta clicar na guia "settings" (configurações) -> "sample buckets" (baldes de amostra) e marcar a caixa "travel-sample" (amostra de viagem). Além disso, precisaremos instalar o Go SDK, que pode ser referenciado no seu aplicativo Go na seção de importação por: "github.com/couchbase/gocb". Isso é tudo!
A consulta
Para mostrar o poder e a flexibilidade do Couchbase e da linguagem de consulta N1QL, vamos usar uma consulta intencionalmente ambígua e aberta. Vamos recuperar qualquer documento que tenha um aeroporto ou nome que contenha uma cadeia de caracteres específica.
Bootstrap do aplicativo
Para começar, vamos primeiro configurar as dependências e a conexão com o Couchbase. Precisamos criar uma API REST simples para a qual possamos emitir comandos curl para solicitações http, exatamente como uma estrutura web javascript de front-end faria. O Go inclui um excelente pacote para fazer isso: "net/http".
Lembre-se, sempre instancie o Couchbase uma vez em seu aplicativo e use-o como referência em todo o aplicativo. Isso permite que o Couchbase opere de forma assíncrona e, ao mesmo tempo, economiza tempo por não precisar ativar/desativar novas conexões com o cluster a cada vez. Isso também garante que seu aplicativo ficará ciente de todas as alterações de topologia à medida que elas ocorrerem. Nossa função principal com a conexão com o Couchbase e os manipuladores de solicitação é construída da seguinte forma:
Caso 1 Fortemente digitado (eu sei o que estou procurando!)
Em um mundo perfeito, em que sabemos exatamente o que os usuários consultarão e sabemos que eles o farão de uma maneira muito estruturada, podemos configurar um esquema rigoroso no qual nossos resultados podem se encaixar. Primeiro, configuramos um struct:
A beleza do JSON em Go é que ele tem suporte nativo, assim como o Couchbase. Não importa qual seja a estrutura dos documentos JSON retornados pela consulta, podemos "filtrar" um esquema estrito usado pelo aplicativo por meio da iteração dos resultados. À medida que iteramos, se o documento do resultado atual corresponder ao que está definido em nossa estrutura JSON, ele será adicionado à matriz de documentos de retorno. Outros campos que são supérfluos são ignorados
A matriz é então transformada em JSON e enviada de volta como resposta. Se fizermos uma solicitação à nossa API para todos os aeroportos com Portland no título: curl https://localhost:3000/api/query/typed?search=Portland, receberemos uma matriz de documentos JSON fortemente tipados/definidos na resposta:
Caso 2 Não digitado (não tenho certeza - apenas me dê tudo!)
Infelizmente, nem tudo se encaixa em esquemas explícitos e estruturas fortemente tipadas. Às vezes, talvez seja necessário emitir uma consulta que retorne uma grande variedade de documentos com esquemas diferentes. Considere a mesma consulta, mas vamos supor que nossa estrutura de front-end queira encontrar qualquer aeroporto, companhia aérea ou ponto de interesse com Portland no nome. A flexibilidade da linguagem Go significa que podemos simplesmente iterar pelos resultados da consulta e transmitir cada documento para uma matriz de variáveis de interface. Não precisamos conhecer o esquema com antecedência.
A combinação resultante de esquemas divergentes é marcada e enviada de volta na resposta. Se fizermos uma solicitação à nossa api curl https://localhost:3000/api/query/untyped?search=Portland, um conjunto diversificado de esquemas diferentes será retornado na resposta.
Caso 3: Retrieve One (Eu só quero o primeiro de volta!)
Vamos pegar o último exemplo e simplificá-lo - vamos apenas retornar o primeiro item nos resultados da consulta. O sdk do Go tem um método para isso no N1QL, ".One()"
Quando emitimos uma solicitação para https://localhost:3000/api/query/one?search=Portland, podemos verificar que apenas um resultado é retornado na resposta
E agora?
A combinação de Couchbase, N1QL e Go é um ambiente incrivelmente eficiente e simplificado, perfeito para criar seu próximo aplicativo Go. Há uma abundância de exemplos no guia do desenvolvedor e muitas informações de introdução no site. Envie um tweet para @Couchbase - conte-nos o que você está fazendo com o Couchbase e o Go!