Banco de Dados

7 nov, 2017

MongoDB para iniciantes em NoSQL – Parte 03

Publicidade

Este é o meu terceiro post da série “tutorial MongoDB para iniciantes em NoSQL “, caso esteja chegando agora aqui no blog, sugiro dar uma olhada na parte um e parte dois.

No tutorial de hoje, vamos explorar alguns comandos muito utilizados para administração de bancos de dados MongoDB, como os comandos de dump e restore, úteis para migrar do ambiente local para produção ou mesmo entre diferentes provedores de cloud computing. Além disso, veremos como mapear nomes de coleções e campos nos documentos.

Fazendo backup com MongoDump

Uma das maneiras de fazer backup da sua base de dados MongoDB é usando o utilitário de linha de comando mongodump, que fica na pasta bin da sua instalação de MongoDB.

Antes de fazer o dump, sugiro criar uma pasta backup na mesma pasta do MongoDB, no mesmo nível da pasta bin.

Considerando que você está rodando um servidor de MongoDB localmente e sem segurança (apenas subiu um mongod como ensinado na parte um desta série) o processo é muito simples. Abra seu terminal de linha de comando e navegue até a pasta bin do MongoDB. Execute o seguinte comando (considerando que tenho uma pasta backup dentro de MongoDB):

C:\mongodb\bin> mongodump --out "C:\mongodb\backup"

O parâmetro ‘–out’ define a pasta onde serão salvas pastas com os nomes das databases e dentro delas os arquivos .bson contendo todas as collections. Os arquivos .bson contém todos os documentos JSON da coleção em questão, mas em formato binário.

Já se o seu servidor for remoto e/ou possuir credenciais de acesso (um cenário bem comum), você deve passar alguns parâmetros adicionais ao executar o utilitário mongodump:

-h <hostname>:<port>: o parâmetro -h permite especificar o endereço completo do host onde está hospedado seu banco MongoDB, incluindo porta. Ex:

C:\mongodb\bin> mongodump -h tatooine.mongodb.umbler.com:27017 --out "C:\mongodb\backup"

-u <username>: o parâmetro -u permite especificar o nome de usuário que será utilizado para conectar na base a ser feito o dump.

-p <password>: a senha do usuário definido no parâmetro -u. Ex:

C:\mongodb\bin> mongodump -h tatooine.mongodb.umbler.com:27017 -u luiztools -p mudar123 --out "C:\mongodb\backup"

Restaurando backup com MongoRestore

Uma vez que você tenha feito seu backup, pode restaurá-lo em outro servidor usando o mongorestore. Para realizar este exemplo da maneira mais didática possível, sugiro que tenha uma conta criada em algum provedor de nuvem que ofereça serviços de MongoDB, como a Umbler (que te dá créditos para usar de graça) ou a mlab.com, que é um serviço exclusivo de MongoDB (dão 500MB de graça pra testar).

Na Umbler, que é a empresa da qual sou Dev Evangelist, você tem de criar primeiro um site em qualquer tecnologia (que tal Node.js?) e depois acessar a opção banco de dados e criar um banco do tipo MongoDB. Não esqueça de anotar os dados de acesso que você definir neste momento, para não se esquecer depois.

Depois que você cria o banco, clicando nele para ver os detalhes, você notará que existem informações para gerenciamento externo, que é justamente o que precisamos para restaurar o backup que fizemos anteriormente.

Gerenciamento Externo do MongoDB

Novamente no terminal de linha de comando, acesse a pasta bin da sua instalação de MongoDB para encontrar o utilitário mongorestore. Use os seguintes parâmetros junto ao mongorestore para orientá-lo corretamente:

-h <hostname>:<port>: para definir endereço do servidor e porta

-d <database>: para definir o nome da base de dados no servidor de destino. Se a base não existir, ela será criada (se o usuário utilizado possuir permissão para isso)

-u <username>: para definir o nome de usuário no servidor de destino

-p <password>: a senha do usuário definido em -u

Além destes parâmetros, a última informação para executar o mongorestore corretamente é o caminho até a pasta de backup da sua database, como abaixo:

C:\mongodb\bin> mongorestore -h tatooine.mongodb.umbler.com:27017 -u luiztools -p mudar123 "C:\mongodb\backup\database"

Opcionalmente, você pode passar um parâmetro -c informando apenas uma coleção que deseja restaurar (ao invés de restaurar a database inteira).

Caso tenha tido problemas em fazer o dump e o restore, eu mostro na prática no finalzinho do vídeo abaixo, que gravei pra Umbler:

Alterando metadados

Nos bancos relacionais temos duas categorias de comandos: DDL e DML. Comandos DML ou Data Manipulation Language são o equivalente ao CRUD que fizemos nas duas partes anteriores desta série. Já os comandos DDL ou Data Definition Language, são os comandos CREATE, ALTER, DROP, etc que os bancos relacionais possuem para modificar os metadados.

O MongoDB não possui uma diferenciação de dados e metadados tão clara quanto nos bancos relacionais, o que impacta diretamente no que você pode e não pode fazer depois que sua base já está em produção. Mudar o nome da sua base de dados, por exemplo, não é possível.

Apesar disso, mudar nome de coleções é possível, embora não recomendado durante horários de muito acesso ao seu banco, pois todas as queries em andamento àquela coleção são dropadas. Para mudar o nome de uma coleção, conecte-se à sua base de dados usando o utilitário mongo, como vimos nos artigos anteriores, e depois use a função renameCollection, passando o novo nome da coleção:

C:\mongodb\bin> db.clientes.renameCollection("clientes")

Note que o MongoDB não é case-sensitive nos nomes de databases, mas nos nomes de coleções, nomes de campos e valores de campos, sim.

Nos bancos relacionais, quando queremos adicionar uma nova coluna, devemos fazer um ALTER TABLE, certo? No MongoDB não há necessidade disso, uma vez que o schema é flexível e conforme você adiciona novos documentos com novos campos, eles passam a surgir e pronto. Mais tarde, se quiser adicionar novos campos em documentos já existentes, basta usar um comando ‘update’ usando o update-operator $set, como já vimos anteriormente:

db.clientes.updateOne({_id: ObjectId("123abc")}, {$set: {novoCampo: valor}})

Novamente falando dos bancos relacionais, quando queremos remover uma coluna, também temos de fazer um ALTER TABLE. No MongoDB não é necessário, basta executar um update passando o update-operator $unset, como abaixo:

db.clientes.updateOne({_id: ObjectId("123abc")}, {$unset: {campovelho}})

E por fim, caso deseje apenas renomear um campo já existente (coisa que também iria requerer um ALTER TABLE no SQL), basta fazermos um update novamente, usando o update-operator $rename:

db.clientes.updateMany({}, {$rename: {nomevelho: nomenovo}})

Note que usei aqui um updateMany e que como filtro passei um objeto vazio. Isso fará com que o update seja realizado sobre TODOS os documentos da coleção clientes. Outro ponto de atenção é que o $rename permite múltiplas renomeações no mesmo update, apenas informando todos os campos que serão renomeados e seus novos nomes, no formato JSON tradicional (que nem em um $set).

A título de curiosidade, e para evitar surpresas, o comando $rename é apenas um atalho para o uso do comando $unset no nome antigo, seguido de um $set com o novo nome e valor antigo. Por causa disso, certifique-se de que não ocorram colisões de nomes na sua coleção para evitar surpresas indesejadas.

No próximo artigo da série, falo sobre modelagem de banco de dados orientado à documentos, para tentar jogar uma luz sobre como fazê-lo conforme mandam as guidelines oficiais do MongoDB. Você também pode ler o que escrevi sobre boas práticas com MongoDB no blog da Umbler!