Continuando os meus estudos no movimento NoSQL, minha nova diversão é o MongoDB, mais um banco baseado em documentos. Agora você vai me perguntar: “Mas é o CouchDB que você estava estudando a um tempo atrás?”, calma caro leitor, é sempre bom ter varias ferramentas na caixa!
Vamos a uma breve descrição do MongoDB:
- MongoDB tem coleções de dados, mas não tabelas como conhecemos. Diferente do CouchDB, que também é um banco orientado a documentos, o MongoDB tem namespaces para dados, estes são “schema-less”, assim os dados poderiam estar organizados por namespaces. Você pode ter seus dados em cada coleção, semelhante ao ActiveRecord com Mysql ou qualquer SGDB.
- MongoDB tem indexes. Mesmo que que em cada coleção não tenha um “schema”, podemos ainda assim criar indexes e deixar as consultas ainda mais rápidas.
- MongoDB tem uma linguagem de consulta. Embora você possa usar o JavaScript para pesquisa através de uma coleção, como CouchDB, você também terá acesso a uma rica linguagem de consulta que pode filtrar com base nos campos, como o SQL, e filtrar com base no conteúdo dos documentos incorporados. Em vez de um complexo JOIN, você pode consultar todos os documentos da coleção de Posts que tiveram um comentário ou mais comentários no último mês de forma simples.
Bem vamos ao que interessa, a diversão!!!
Começaremos instalando o MongoDB, para não ser repetitivo, você encontrará mais informações no site oficial.
Galera do MacOS, prefiram seguir as instruções ao invés de usar o macports, eu tive problemas instalando o mongodb por ele(na verdade com as dependências), as instruções no site do MongoDB são muito mais simples.
Bem com tudo instalado vamos ao Ruby. Primeiro instale as gems:
gem install gemcutter
Depois as gems dos drivers do MongoDB.
gem install mongo gem install mongo_ext
Só mais 8 minutos…
Em um terminal IRB rode.
require 'rubygems' require 'mongo'
Conectando no banco:
conn = Mongo::Connection.new
db = conn.db("meu_bd")
Definindo uma coleção
coll_usuarios = db.collection("usuarios")
Inserindo documentos em uma coleção
coll_usuarios.insert({:nome => "Alan",
:email => "alanrrb@gmail.com",
:nickname => "alanrrb"})
coll_usuarios.insert({:nome => "Jose",
:email => "jose12332@gmail.com",
:nickname => "jose123321"})
coll_usuarios.insert({:nome => "Tom",
:email => "tom321123@gmail.com",
:nickname => "tom321123"})
Consultando um registro
usuario = coll_usuarios.find_one() p usuario
{"_id"=>4b7e23b01919ba0353000001, "nome"=>"Alan", "email"=>"alanrrb@gmail.com", "nickname"=>"alanrrb"}
Buscando todos documentos com o nome “Tom”
coll_usuarios.find(:nome => "Tom").each do |doc| p doc end
{"_id"=>4b7e23b01919ba0353000003, "nome"=>"Tom", "email"=>"tom321123@gmail.com", "nickname"=>"tom321123"}
Mais 5 minutos…
E lá vem você com mais uma pergunta: “E aí, como incluir MongoDB em meus projetos Ruby e/ou Rails?”
E eu novamente lhe trago uma resposta… Existem alguns projetos interessantes de Object Mapper para MongoDB, destes o qual eu mais me interessei foi este MongoMapper, por parecer mais maduro e estar pronto para coloca-lo em produção sem grandes receios.
Mapeando Documentos
require 'mongo_mapper' MongoMapper.database = "meu_bd" class Usuario include MongoMapper::Document key :nome, String key :email, String key :nickname, String end
Criando documentos e salvando:
marcia = Usuario.new marcia.nome = "Marcia" marcia.email = "email_marcia@gmail.com" marcia.nickname = "nick_marcia" marcia.save
Complicando um pouco mais, vamos adicionar relacionamentos
class Usuario include MongoMapper::Document many :pagamentos end class Pagamento include MongoMapper::Document key :valor, Float belongs_to :usuario end marcia.pagamentos << Pagamento.new(:valor => 1.15) marcia.save
Semelhante a um framework que conhecemos, o MongoMapper gera automaticamente alguns métodos, então é possível fazer isso:
alan = Usuario.find_by_nome("Alan")
p alan
#<Usuario nickname: "alanrrb", nome: "Alan", _id: 4b7e23b01919ba0353000001, email: "alanrrb@gmail.com">
Criando um documento e persistindo.
david = Usuario.create(:nome => "David", :email => "david321123@gmail.com", :nickname => "david") p david
#<Usuario nickname: "david", nome: "David", _id: 4b7e23b11919ba0353000006, email: "david321123@gmail.com">
Se você conhece o ActiveRecord, com certeza viu algumas semelhanças e já esta com algumas ideias para incluir MongoDB nos seus próximos projetos, mas isso será assunto para a próximo post.
Os códigos usados neste post estão publicados aqui.
Por enquanto é só, não esqueçam de deixar seus comentários!
Muito bom o post! Favoritei e voltarei a consultar pra fazer alguns testes.
O que criastes com o mongo até agora?
Abraço!
Comentário por Gabriel — fevereiro 19, 2010 @ 3:25 am |
Eae Alan,
Muito bom este post hein!!!
Vou pegar ele passo a passo e testar!!
Muito obrigado pelo ensinamento prático e sucinto.
Abraços,
Paulo.
Comentário por Paulo R. A. Sales — fevereiro 19, 2010 @ 8:58 am |
Falae brow!
Legal o post! O texto ficou bem dinâmico e divertido de ler.
Tb gosto do estilo descomplicado do MongoDB. Vamos acompanhar a evolução desse banco e por que não considerá-lo em algum projeto..
obs.: Só tenho uma pequena dúvida no seu exemplo de criação de usuário. O nickname correto do usuário david não seria “gordin”?
Abraços!
-LeoLuz-
Comentário por LeoLuz — fevereiro 19, 2010 @ 9:47 am |
Brother,
Ficou Show de bola o post, como os outros posts, simples e direto.
Obs. Faltou Criar o Usuário Calopsita vulgo Tanga!
[]‘s
David
Comentário por David Lins — fevereiro 20, 2010 @ 6:59 pm |
[...] am Tags: desenvolvimento, mongodb, nosql, pragmatismo, rails, Ruby, teste Você que leu o post 10 minutos com Ruby e MongoDB, provavelmente ficou pensando: “Como incluo o MongoDB no meu projeto Rails?”, bem, este [...]
Pingback por Primeiro projeto Rails com MongoDB0 « Papo de Corredor — fevereiro 22, 2010 @ 2:51 am |
@Gabriel
!
Veja o post Primeiro projeto com Rails e MongoDB
@LeoLuz e @David
Acho que vou deixar o post do jeito que está para não criar problemas
[]‘s
Comentário por Alan Rafael R. Batista — fevereiro 22, 2010 @ 2:53 am |
Tenho uma pergunta, que acho que vc pode me ajudar!
Eu fiz um teste com um dos templates que vc “forkou”. O banker’s Rails MongoMapper Template (http://gist.github.com/219223)
Mas obtive o seguinte erro ao executá-lo:
applying template: http://gist.github.com/219223
/Users/fabio/.rvm/gems/ruby-1.9.1-p378/gems/rails-2.3.5/lib/rails_generator/generators/applications/app/template_runner.rb:26:in `instance_eval’: (eval):1: syntax error, unexpected ‘<' (SyntaxError)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
^
(eval):4: syntax error, unexpected '<'
^
(eval):4: syntax error, unexpected tIDENTIFIER, expecting $end
^
Vc sabe o que pode ser? Obrigado!
Comentário por Fábio T. da Costa — abril 21, 2010 @ 2:26 pm |
foi mal… postei no lugar errado…! Era para ser no tópico do tutorial do mongomapper!
Comentário por Fábio T. da Costa — abril 21, 2010 @ 2:36 pm |
Então cara, isto é um problema com a instrução “Heredoc” ou Here Document.
Para não alongar muito, substitua o “<<HTML" por "%w[" e no fim do substituir "HTML" por "]".
Desse jeito o template funcionará sem problemas.
[]'s
Comentário por Alan Rafael R. Batista — abril 21, 2010 @ 3:51 pm |
Sem problemas, assim quem ver seu comentário fica convidado a ler o outro post
!
Comentário por Alan Rafael R. Batista — abril 21, 2010 @ 3:56 pm |