Primeiros passos NoSQL com MongoDB: manipulando documentos

Continuando meu post anterior sobre o assunto, é hora de colocarmos a teoria em prática. Meu objetivo agora é expor o básico sobre o funcionamento e operação do MongoDB para que, em seguida, possamos aplicar este SGBD a alguma linguagem de programação (muito provávelmente usarei o Groovy, que cai como uma luva).

Instalando o Servidor

De todos os SGBDs não relacionais que experimentei, aquele com qual tive mais facilidade para trabalhar foi o MongoDB por duas razões: ele é realmente simples e a documentação é excelente. A facilidade do sistema se apresenta no primeiro contato que temos com a criatura: instalando-o.

Simples e rápido: baixe a versão que se adequa ao seu sistema operacional neste link. Descompacte-o em um diretório de sua escolha e o bicho está quase pronto para ser usado.

Para iniciar o servidor, você deverá executar o programa mongod, presente no diretório $MONGODB/bin (entenda $MONGODB como sendo o diretório aonde você descompactou a sua distribuição do programa). Você será saudado por uma nada simpática mensagem de erro na qual encontrará um texto similar ao abaixo:

Thu Apr 15 21:32:54 Assertion: 10296:dbpath (/data/db/) does not exist

Isto ocorre porque por default o MongoDB armazena seus bancos de dados no diretório /data/db (C:\data\db se estiver usando Windows). A solução é simples: ou você cria este diretório ou inicia o processo mongod com o parâmetro -dbpath como no exemplo abaixo:

$mongodb/bin/mongod -dbpath=/home/kicolobo/mongodb

Neste caso, estou instruindo o servidor a buscar pelos arquivos de banco de dados dentro do diretório /home/kicolobo/mongodb

Nota: é importante mencionar que se eu inicio o MongoDB usando a abreviação ~ para o meu diretório home (por exemplo: ~/mongodb) o processo mongod não identifica o diretório, retornando aquela mesma entediante mensagem de erro (ao menos no Mac OS X).

Observação importante: caso você esteja usando uma versão de 32 bits do MongoDB, esta possuirá o tamanho dos bancos de dados limitados a no máximo 2 Gb.

Conectando-se

O cliente nativo do MongoDB é o programa mongo, localizado no diretório $MONGODB/bin. Com o servidor em execução, caso você inicie este aplicativo automáticamente já estará logado no servidor default, que é o local usando a porta 27017. Não é necessário prover um usuário (posso falar mais sobre gerenciamento de usuários em um post futuro no entanto). Ao iniciar o shell você será saudado por um prompt similar ao exposto na imagem abaixo:

Neste podemos fazer basicamente tudo o que quisermos com o MongoDB. Por default, estamos conectados ao banco de dados test. Para mudar de banco de dados, basta usar o comando use seguido do nome do banco de dados. Por exemplo use kico;.

Manipulando dados

Inserindo

No MongoDB, cada banco de dados é composto por um conjunto de coleções. O código abaixo, apesar de muito simples nos diz muita coisa:


> use kico
switched to db kico
> a = {posicao:1, descricao:"Primeira letra do alfabeto"}
{ "posicao" : 1, "descricao" : "Primeira letra do alfabeto" }
> db.alfabeto.save(a)
> a
{
 "posicao" : 1,
 "descricao" : "Primeira letra do alfabeto",
 "_id" : ObjectId("4bc7b65da5ec5e132c1a53a1")
}

A primeira coisa que fiz foi selecionar o banco de dados kico usando o comando use. Se este banco de dados não existisse, o MongoDB o criaria automaticamente para nós.

Em seguida, criei uma variável chamada a, cujo valor é uma estrutura no formato JSON composta por dois atributos: posicao e descricao. Lembre-se que estamos lidando aqui com um SGBD schemaless: sendo assim posso criar documentos com o formato que eu sonhar.

(Por possuir um shell baseado em JavaScript, é possível escrever scripts e usá-los para tarefas de manutenção do banco. Trata-se de um recurso fantástico que, um dia, pretendo abordar com maiores detalhes neste blog.)

Para inserir o meu documento a em uma coleção, usei o objeto db, que aponta para o banco de dados atualmente selecionado. A sintaxe para inclusão de um registro é simples:

db.[nome da coleção].save( objeto a ser salvo )

No caso, estou incluindo o documento a dentro da coleção alfabeto. Assim como no caso do banco de dados, se esta coleção não existir no banco de dados atual, esta será criada automaticamente no momento em que o primeiro documento for inserido.

Claro, eu também poderia incluir um novo registro na coleção alfabeto tal como no exemplo abaixo:

db.alfabeto.save({posicao:5, letra:"e"})

Finalmente, expus o conteúdo do documento a após ter sido incluido na coleção. Observe a inclusão de um novo atributo neste objeto: o _id .Como o próprio nome já diz, um identificador interno usado pelo MongoDB para diferenciar os objetos armazenados em nossas coleções. É importante mencionar que este atributo só será criado pelo MongoDB caso ainda não exista na estrutura a ser armazenada. Sendo assim, você é livre para criar seus próprios identificadores se quiser.

Editando e excluindo

Editar um registro também é fácil. Novamente, vamos analisar um código bem simples que nos dirá bastante coisa:


documento = db.alfabeto.findOne({posicao:1})
documento.bobagem = "Veja, estou incluindo um novo atributo completamente inútil!"
db.alfabeto.save(documento)
db.alfabeto.remove(documento)

O primeiro passo foi usar o método findOne presente na nossa coleção alfabeto. Este recebe como parâmetro um fragmento de documento e, como o próprio nome já nos diz, retorna um único resultado para nós.

Dai pra frente é simples: adiciono um novo atributo ao nosso documento e em seguida o persisto novamente na coleção usando o mesmo método save() que vimos anteriormente. A diferença é que aqui será feita uma substituição, visto que o documento em questão já possui um atributo _id.

Nota importante: você pode dar o nome que sonhar para um atributo, porém duas regras devem ser satisfeitas: O nome do atributo não deve começar com o caractere $ e o caractere ‘.’ jamais poderá ser incluido.

Continuando

No próximo post (que pretendo publicar nesta semana) vou mostrar como fazer consultas no MongoDB. Não inclui este conteúdo agora porque tornaria este post gigantesco e não trataria com o detalhamento que desejo o assunto.

Sendo assim, aguardem pelo próximo post sobre o assunto. Até lá!

25 comentários em “Primeiros passos NoSQL com MongoDB: manipulando documentos”

  1. Muito legal.

    O Mongodb deve ser util principalmente para aplicações que envolvem documentos como catalagos, documentos de processos etc… ?

    Será que seria indicado para aplicações substituir um db relacional como o mysql ou postgresql ?

    1. Oi Silfar,

      depende do caso né? No meu caso, é bastante útil em situações nas quais a organização dos registros, por mais que nos esforcemos, não seja sempre “bonitinha”, contendo sempre os mesmos campos, etc.

      Estou usando para o gerenciamento de especificações de equipamentos, por exemplo, em que sempre aparece um atributo a mais que precisa ser cadastrado e que por questões de performance/modelagem mesmo não se aplica.

      Eu uso também em aplicações matemáticas (pense em como representar uma matriz no modelo relacional que você vai entender na hora o que quero dizer).

      Tem também a questão da performance né? Mas não é o meu caso até agora.

    1. Que bom que gostou. Estava lendo alguns do seu grupo e são muito bons também! Parabéns!

  2. Felipe Magalhães

    Ótimos posts estes de MongoDB, meu caro! Tá favoritado no Delicious…
    Só uma observação, quanto à edição: também é possível usar o comando “update”, conforme é mostrado no http://try.mongodb.org/

    Exemplo: db.users.update({posicao: 1}, {bobagem: “Veja, estou incluindo um novo atributo completamente inútil!”});

    1. Fico feliz que tenha gostado Felipe! Bacana esta forma de edição, não conhecia. Bem melhor!

      O que é bacana neste “mundo novo” é que como é tudo muito novo (de fato) para nós que estamos adentrando no assunto, podemos aprender pra daná uns com os outros. E é por isto que eu criei este blog. Fico feliz que esteja funcionando!

    2. Luiz Guilherme

      Neste caso, você perde todos os dados do objeto e passa a ter apenas o atributo ‘bobagem’. Acho que não era o objetivo.
      Você teria que inserir o objeto inteiro no update, não somente o campo que deseja alterar…

  3. Muito bom mesmo, estou querendo aprender sobre nosql, mas especificamente mongoDB, e esse post foi ate agora o melhor material de introdução em portugues que achei, com ele realmente consegui colocar a carruagem para andar.
    Pena que vc não continuou com o assunto.

  4. Olá Henrique,

    fiquei com uma dúvida: estava fazendo uns testes com o Mongo + PHP, mas não consegui entender como ele salva os dados. Existe um arquivo físico que podemos acessar quando uma nova base é criada?

    1. Kico (Henrique Lobo Weissmann)

      Oi Fernando, existe, mas não sei se da pra ler diretamente. É o diretório aonde os bancos de dados ficam salvos.

      Você usa o próprio comando mongo pra poder fazer suas consultas e tal.

      1. Entendi. Eu encontrei um app chamado MongoHub, pra gerenciar as bases do Mongo graficamente. Assim dá pra ter uma noção um pouco melhor de como ele funciona!

        Valeu pela resposta! E o tutorial impecável, muito fácil de aprender pra quem tá começando agora com o MongoDB =)

  5. Artigo muito bom, só tenho um duvida, será que o mongodb será interessante pra um sistema de cadastro de clientes simples ?

    1. Kico (Henrique Lobo Weissmann)

      Neste caso não vejo vantagem alguma. O moeelo relacional vai te atender bem mais.

  6. Olá, gostei muito da postagem sobre mongo D, gostaria de saber se tem algum livro em português que poderia me indicar para me aprofudar mais?

    Obrigado

    1. Kico (Henrique Lobo Weissmann)

      Em português, neste momento, infelizmente não.
      Mas uma boa fonte é a documentação oficial do produto.

  7. Kico, parabens pelo site. Muito bom!

    Trabalho com banco de dados geograficos! Voce sabe me informar se o MongoDB serve para esse tipo especifico de banco? Voce teria alguma documentacao que possa me indicar??

    Agradeco a atencao!

    Angelica

    1. Kico (Henrique Lobo Weissmann)

      Em uma única consulta, não. Aliás, se precisa fazer joins com MongoDB, minha sugestão é evitá-lo a todo custo.

  8. Parabéns pelo post,

    Estou curiando esses carinhas nosql e já deu para ter um norte do que vou encontrar pela frente.

    Obrigado!

Deixe uma resposta

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Rolar para cima