10 minutos de Ruby e MongoDB

por em desenvolvimento,mongoDB,NoSql,rails,ruby Nenhum comentário

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!


Switch to our mobile site