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!





