Práticas recomendadas e tutoriais

Migrar do MongoDB para o Couchbase com o N1QL

Os clientes frequentemente nos dizem que estão se preparando para migrar do MongoDB para o Couchbase. Em parte, eles vêm porque estão cansados dos problemas que tiveram ao aprender a consultar o MongoDB. O Couchbase com N1QL oferece uma alternativa melhor, especialmente para o dimensionamento de aplicativos modernos.

Infelizmente, com o MongoDB, as opções de migração podem ser limitadas. Uma delas, sobre a qual escrevi recentemente, envolve a mudança de de MongoDB com Mongoose para Couchbase com Ottoman. O ponto central desse tutorial foi o uso de duas ferramentas ODM diferentes no Node.js que compartilhavam as mesmas APIs, tornando a transição quase perfeita. No entanto, e se você não estiver usando um ODM no MongoDB e não tiver interesse em usar um?

Desta vez, vamos dar uma olhada na transferência de um aplicativo Node.js que usa o MongoDB e a linguagem de consulta do MongoDB para o Couchbase com o N1QL. Em resumo, o N1QL é uma tecnologia que permite que você execute consultas SQL em dados JSON complexos. Isso a torna não apenas fácil de usar, mas também muito limpa na camada de aplicativos. Mais informações sobre o N1QL podem ser encontradas na seção Portal do desenvolvedor do Couchbase.

Vamos usar o mesmo problema de exemplo usado no Artigo anteriormas não há problema se você ainda não o viu. Tudo aqui será iniciado com uma lousa limpa.

Os requisitos

Há alguns requisitos que devem ser atendidos para garantir que você tenha sucesso com este guia. Eles podem ser vistos a seguir:

Como veremos os equivalentes do MongoDB e do Couchbase, você deve ter os dois bancos de dados disponíveis. Se já for um desenvolvedor do MongoDB, muitas coisas podem ser familiares para você, mas a decisão é sua.

Entendendo o modelo de dados NoSQL

Antes de desenvolver a API RESTful com qualquer uma das tecnologias, é uma boa ideia entender primeiro o modelo de dados que será usado.

Embora o MongoDB e o Couchbase sejam bancos de dados de documentos, eles não são totalmente iguais. O MongoDB armazena dados como BSON, enquanto o Couchbase armazena dados como JSON. Do ponto de vista da modelagem, isso realmente não importa para nós.

Considere o modelo de dados de uma escola em que você tem alunos e cursos. Para cada curso oferecido na escola, você pode ter um documento parecido com o seguinte:

Cada curso manterá uma lista de todos os alunos que foram registrados. Nesse caso, a lista consistirá em valores de id que fazem referência a outros documentos. Estamos estabelecendo nossas próprias relações de documentos.

Para cada aluno da escola, eles podem ter um documento NoSQL parecido com o seguinte:

Observe que o documento acima é semelhante à forma como modelamos nossos cursos. Cada aluno manterá uma lista de todos os cursos em que está matriculado. Esses cursos são IDs que fazem referência ao documento apropriado do curso.

Há centenas de maneiras diferentes de modelar nossos documentos, e este é apenas um exemplo. Para obter mais informações sobre modelagem de dados, dê uma olhada em documentação.

Agora que temos um modelo para nossos documentos, podemos nos concentrar na criação de uma API com cada tecnologia.

Desenvolvimento de uma API com a linguagem de consulta do MongoDB

Embora você possa ter seu próprio código de aplicativo MongoDB, vamos criar um do zero para que a migração permaneça muito fácil de entender.

Vamos começar criando um novo projeto em nosso prompt de comando ou terminal:

Os comandos acima criarão um novo package.json em seu diretório de trabalho atual e instale as dependências necessárias da estrutura e do banco de dados.

No final das contas, queremos que nosso projeto MongoDB tenha a seguinte estrutura:

Toda a interação com o banco de dados será feita a partir de cada um dos modelos e todo o roteamento de API e a interação com o cliente serão feitos a partir do rotas arquivos. A inicialização do aplicativo e a conexão com o banco de dados serão feitas a partir do arquivo app.js arquivo.

Criação de um modelo de banco de dados MongoDB no aplicativo

Então, vamos dar uma olhada em um dos nossos modelos de banco de dados. Abra a seção models/course.js e inclua o seguinte código:

Há muita coisa acontecendo no modelo de banco de dados acima. Precisamos dividi-lo para facilitar a compreensão. Quanto mais entendermos, mais fácil será o processo de migração para o Couchbase.

Quando desejamos salvar um documento, temos a opção salvar método:

Usando o banco de dados aberto, podemos inserir um único documento na coleção desejada usando o comando insertOne function. Nessa função, passamos dados que pode ser um objeto JavaScript de qualquer complexidade que desejamos salvar. Depois de salvo, o resultado será retornado ao método pai que o chamou.

E se quisermos atualizar um documento que já existe? Em particular, e se quisermos adicionar um aluno a um curso já existente?

Para este exemplo específico, podemos atualizar todo o estudantes que existe no documento:

O código acima usará o updateOne para pesquisar um determinado documento por id e substituir o método estudantes com uma nova matriz que fornecemos por meio do updateStudents função.

Nada muito difícil até agora e nenhum estresse real adicionado ao desenvolvedor.

É aqui que as coisas mudam. Quando salvamos os dados, estamos salvando uma matriz de valores de id. Esses não são dados que queremos ver nas operações de consulta. Em vez disso, queremos preencher ou expandir esses valores de id em seus equivalentes de documento:

Para que isso seja possível, a matriz deve primeiro ser achatada por meio de um $unwind e unidos por meio de um $lookup operação. E não para por aí, pois queremos que nossos resultados sejam formatados da mesma forma, apenas substituindo os ids por objetos. Por isso, temos que fazer mais achatamentos, agrupamentos e manipulações.

Uma explicação completa sobre a união de dados no MongoDB versus a união de dados no Couchbase pode ser vista em um artigo completo que escrevi anteriormente sobre o assunto.

Resumindo, quanto mais complicados forem seus dados, mais complicada será sua consulta de agregação. Para um modelo de dados flexível, isso se torna pouco flexível para um desenvolvedor de aplicativos.

Vamos dar uma olhada rápida em nosso outro modelo, aquele que gerenciará os dados dos alunos. Abra a seção models/student.js e inclua o seguinte código JavaScript:

Praticamente as mesmas regras se aplicam ao modelo acima em comparação com o modelo que vimos representando os dados do curso. Isso se deve ao fato de que os dois modelos de documento eram muito semelhantes no início. Na maior parte, são planos, com uma matriz de valores de id.

Isso nos leva aos pontos de extremidade da API que fazem uso desses métodos de banco de dados.

Criação de rotas de API RESTful para o aplicativo

Essa é a parte fácil e, na verdade, a mais consistente entre as duas tecnologias de banco de dados, pois não depende do banco de dados.

Vamos dar uma olhada no projeto rotas/cursos.js file:

No código acima, temos três rotas de API. A partir de um cliente externo, poderemos listar todos os cursos, localizar um curso específico ou salvar um novo curso.

Dependendo de qual endpoint for atingido, a função apropriada do modelo de banco de dados será executada. Não é feito muito trabalho pesado nas rotas, que, com base em seu nome, destinam-se apenas ao roteamento.

O outro arquivo de roteamento será um pouco diferente. Abra o arquivo routes/students.js e inclua o seguinte código JavaScript:

Como na outra rota, há muita coisa acontecendo, mas a maior parte é praticamente idêntica. As diferenças estão na /estudante/curso que é responsável por adicionar cursos a um aluno e alunos a um curso.

Ao acessar esse endpoint, primeiro obtemos as informações do aluno e do curso com base no valor de id passado. Ambos precisam existir, caso contrário, lançaremos um erro. Se ambos existirem, enviaremos o ID do aluno para a variável estudantes para o documento do curso e o ID do curso na matriz cursos do documento do aluno. Em seguida, chamaremos nosso método de atualização e retornaremos um resultado para o usuário final.

Reunindo tudo e inicializando o aplicativo

Neste ponto, a API está pronta para ser usada. Só precisamos inicializar o aplicativo Node.js e nos conectar ao banco de dados. Essa é a parte mais fácil.

Abra o arquivo app.js e inclua o seguinte código:

No código acima, estamos importando cada uma das dependências que baixamos e inicializando o Express Framework. Antes de começarmos a servir a API, precisamos estabelecer uma conexão com o MongoDB. Depois que a conexão é estabelecida, as rotas são conectadas e o aplicativo começa a servir.

Nesse ponto, a API RESTful pode ser acessada em http://localhost:3000 e testada com ferramentas populares como Carteiro ou Fiddler.

Desenvolvimento de uma API com Couchbase e N1QL

Portanto, temos um exemplo com o qual trabalhar quando se trata de MongoDB e Node.js. Esse exemplo usou a linguagem de consulta do MongoDB ao se comunicar com o banco de dados.

Agora, vamos pegar esse aplicativo e movê-lo para Couchbase. Estamos fazendo isso porque, além de o Couchbase ser mais escalonável e ter melhor desempenho, a linguagem de consulta é muito mais simples e fácil de manter em um aplicativo.

Assim como no aplicativo MongoDB, vamos começar do zero, embora muito do que veremos seja idêntico. No prompt de comando ou no terminal, execute o seguinte:

Os comandos acima devem parecer familiares. Estamos criando um arquivo package.json e instalando nossas dependências, mas, em vez do MongoDB, estamos usando o Couchbase.

O projeto terá a mesma estrutura vista no projeto anterior. Ele deve ter a seguinte aparência:

A mesma lógica vista anteriormente terminará em cada um desses arquivos. A diferença é a sintaxe do Couchbase.

Criação de um modelo de banco de dados do Couchbase no aplicativo

Começando com a mesma ordem, vamos criar nossas funções de modelo de banco de dados. Conforme mencionado anteriormente, usaremos o N1QL, que é um destaque extremo do Couchbase, pois permite que você escreva consultas SQL. Essas consultas são executadas no banco de dados e não no aplicativo Node.js.

Abra o arquivo models/course.js e inclua o seguinte código:

No código acima, temos o mesmo conjunto de funções relacionadas ao banco de dados que vimos no exemplo do MongoDB. Dentro de cada uma dessas funções há consultas N1QL. Não apenas consultas N1QL, mas consultas N1QL parametrizadas para ajudar a combater ataques de injeção de SQL.

Dê uma olhada no getAll que antes era muito complicado na versão do MongoDB:

Desta vez, temos uma consulta simples que inclui uma subconsulta. Se nossas necessidades de dados se tornarem mais complexas, a consulta poderá ser alterada sem aumentar significativamente o tamanho ou a complexidade.

Então, vamos dar uma olhada em nosso outro modelo de banco de dados. Abra a seção models/student.js e inclua o seguinte código JavaScript:

Parece familiar? Os dois modelos de banco de dados são semelhantes porque os dois modelos de documentos são semelhantes. Novamente, se a complexidade mudar, a camada do aplicativo ainda será fácil de gerenciar com consultas N1QL.

Como as rotas de API não têm nenhuma dependência do banco de dados, o código entre o aplicativo MongoDB e o aplicativo Couchbase pode ser compartilhado. Para ser claro, estou me referindo aos arquivos encontrados no diretório rotas diretório.

Inicialização do aplicativo e conexão com o Couchbase

Com os pontos de extremidade instalados e os modelos de banco de dados se comunicando com o Couchbase por meio do N1QL, podemos concluir o aplicativo.

Abra o arquivo app.js e inclua o seguinte código JavaScript:

No código acima, estamos importando as dependências que instalamos e inicializando o Express Framework. Em seguida, estamos estabelecendo uma conexão com o banco de dados, reunindo nossas rotas e iniciando o servidor Node.js.

Como estamos usando o N1QL, não se esqueça de criar pelo menos um índice no seu Couchbase Bucket. Ele pode ser tão simples quanto o seguinte:

Neste ponto, você deve conseguir acessar seu aplicativo da mesma forma que o MongoDB. Visite http://localhost:3000 em seu navegador da Web ou com uma ferramenta como Postman ou Fiddler.

Conclusão

Você acabou de ver como pegar um aplicativo Node.js que usa o MongoDB e a linguagem de consulta do MongoDB e convertê-lo para o Couchbase com o N1QL. Essa é uma alternativa ao método ODM de mangusto para otomano sobre a qual escrevi anteriormente.

Então, por que você quer mudar do MongoDB para o Couchbase? Bem, o Couchbase é muito mais rápido e fácil de escalonar, mas o N1QL também é incrivelmente simples quando se trabalha com dados complexos. Você poderá reduzir drasticamente seu código e mantê-lo mais sustentável. Confira a consulta Couchbase vs. MongoDB tutorial Escrevi sobre a união de dados entre os dois bancos de dados.

Para obter mais informações sobre como usar o Couchbase em um aplicativo Node.js:

 

Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Nic Raboy, defensor dos desenvolvedores, Couchbase

Nic Raboy é um defensor das modernas tecnologias de desenvolvimento móvel e da Web. Ele tem experiência em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experiências de desenvolvimento relacionadas a tornar o desenvolvimento móvel e da Web mais fácil de entender.

Um comentário

  1. [...] sobre a conversão de seus aplicativos Node.js com MongoDB para o Couchbase. Isso incluiu um tutorial da linguagem de consulta do MongoDB para N1QL, bem como um tutorial do Mongoose para Ottoman. Esses foram ótimos tutoriais de migração de um [...]

Deixe um comentário

Pronto para começar a usar o Couchbase Capella?

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Use o Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Entre em contato

Deseja saber mais sobre as ofertas do Couchbase? Deixe-nos ajudar.