Marcio Trindade

Começando com Mongoid

Hoje quero mostrar algo muito simples, mas é pra encorajar as pessoas que ainda não usaram o MongoDB como banco de dados de seus projetos.

É importante você conhecer pelo menos um pouco do mongodb, saber como instalar, iniciar, parar, reiniciar, fazer uma query e inserir e editar documentos.

Depois que já tiver este background então vale a pena dar uma olhada na página do Mongoid, que é uma ótima gem criada pelo Durran Jordan pra trabalhar com mongodb no rails.

Para instalar é bem simples:

Gemfile
gem "mongoid", "~> 2.4"
gem "bson_ext", "~> 1.5"

Não deixe de rodar o bundle install, então basta chamar o generate do rails pra criar o arquivo de configuração.

console
rails g mongoid:config
create  config/mongoid.yml

Se você não for utilizar o ActiveRecord recomendo que retire seu require alterando a linha abaixo:

config/application.rb
require 'rails/all'

por estas linhas

config/application.rb
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "rails/test_unit/railtie"
require "sprockets/railtie"

Agora você já pode criar seus models usando o mongoid ao invés de usar o ActiveRecord, para isso veja um exemplo abaixo:

app/models/user.rb
class User
  include Mongoid::Document
  include Mongoid::Timestamps

  field :name
  field :email
end

Podemos observar que os campos deste modelo são descritos na class, logo você não precisa mais de migrations o que tem suas vantagens e desvantagens que pretendo explicar com mais detalhes em artigos futuros.

A mongoid tem os mesmo relacionamentos que o ActiveRecord, porém você ainda tem os relacionamentos abaixo para embedar documentos:

example.rb
class User
  include Mongoid::Document
  include Mongoid::Timestamps

  field :name
  field :email

  embedded_in :group # para os documentos que são embedados
  embeds_many :roles # para os documentos que embedão outros documentos
  embeds_one :address # para os documentos que embedão um único documento
end

Buscar documentos

O MongoDB realmente é muito poderoso pra encontrar documentos, então vale a pena dar uma estudada nessa parte no site do mongoid.

A idéia é bem parecida com o ActiveRecord que pra cada método chamado retorna um objeto do tipo relation e pode ser combinado com outros relations e executa a query somente quando nescessário, a diferença é basicamente o nome que na mongoid se chama criteria.

Como no MongoDB você pode ter fields do typo Array ou Hash logo as buscas podem ser feitas com os valores dentro destes como é o caso dos métodos all_in, all_of any_in, any_of, not_in, includes e excludes.

O metodo order do ActiveRecord tem o nome de order_by no mongoid que recebe como parametro um array de arrays.

rails console
User.order_by([[:first_name, :asc], [:last_name, :desc]])

Outra diferença fica por conta do where que pode utilizar símbolos h4s que aprimoram sua consultas, veja alguns exemplos abaixo:

rails console
Person.where(:title.all => ["Sir"])
Person.where(:age.exists => true)
Person.where(:age.gt => 18)
Person.where(:age.gte => 18)
Person.where(:title.in => ["Sir", "Madam"])
Person.where(:age.lt => 55)
Person.where(:age.lte => 55)
Person.where(:title.ne => "Mr")
Person.where(:title.nin => ["Esquire"])
Person.where(:aliases.size => 2)
Person.where(:location.near => [ 22.50, -21.33 ])
Person.where(:location.within => { "$center" => [ [ 50, -40 ], 1 ] })
Person.where(
  :skills.matches => {:level => "pro", :name => "photographer"}
)
Person.where(age: 18...35)

Note que você também pode usar esta notação pra documentos embedados:

rails console
Person.where(:"addresses.house_no".gt => 100)

Salvando documentos

Salvar documento é basicamente da mesma forma que o ActiveRecord salva registros, basta você passar os parametros no create, save, update_attribute ou update_attributes.

As validações também funcionam normalmente, visto que a partir do Rails3 foram separadas do ActiveRecord e estão no ActiveModel.

Bom por hora é isso e em breve vou trazendo mais dicas.