1) MongoDB é um banco de dados NoSQL orientado a documentos que permite armazenar, consultar e analisar dados não estruturados;
2) Pode ser instalado em vários sistemas operacionais e conecta-se via shell, permitindo inserção, atualização e busca flexível de documentos sem esquema pré-definido;
3) Suporta queries, índices, replicação e sharding para alta performance e disponibilidade.
48. Defaults class Person include Mongoid::Document field :blood_alcohol_level, type: Float, default: 0.40 field :last_drink, type: Time, default: -> { 10.minutes.ago } end
49. Serialização de Campos customizados class Profile include Mongoid::Document field :location, type: Point end class Point include Mongoid::Fields::Serializable def deserialize(object) [ object["x"], object["y"] ] end def serialize(object) { "x" => object[0], "y" => object[1] } end end
50.
51. Acesso: Protected class User include Mongoid::Document field :first_name, type: String field :password, type: String attr_protected :password end # Ajusta atributos em uma pessoa de forma apropriada Person.new(first_name: "Corbin") person.attributes = { first_name: "Corbin" } person.write_attributes(first_name: "Corbin") # Tenta ajudar os valores, levantando um erro Person.new(first_name: "Corbin", password: "password") person.attributes = { first_name: "Corbin", password: "password" } person.write_attributes(first_name: "Corbin", password: "password")
52. Acesso: Accessible class User include Mongoid::Document field :first_name, type: String field :password, type: String attr_accessible :first_name end # Ajusta atributos em uma pessoa de forma apropriada Person.new(first_name: "Corbin") person.attributes = { first_name: "Corbin" } person.write_attributes(first_name: "Corbin") # Tenta ajudar os valores, levantando um erro Person.new(first_name: "Corbin", password: "password") person.attributes = { first_name: "Corbin", password: "password" } person.write_attributes(first_name: "Corbin", password: "password")
54. Dirty Tracking person = Person.first person.name = "Alan Garner” # Checa para ver se o documento foi alterado person.changed? #=> true # Obtém um array dos nomes dos campos alterados person.changed #=> [ :name ] # Obtém um hash do antigo e do novo valor para cada campo person.changes #=> { "name" => [ "Alan Parsons", "Alan Garner" ] } # Checa se um campo específico foi alterado person.name_changed? #=> true # Obtém as mudanças para um campo específico person.name_change #=> [ "Alan Parsons", "Alan Garner" ] # Obtém o valor anterior de um campo person.name_was #=> "Alan Parsons" class Person include Mongoid::Document field :name, type: String end
55. Limpando mudanças person = Person.first person.name = "Alan Garner" # Reinicializa o nome alterado de volta ao original person.reset_name! person.name #=> "Alan Parsons"
56. Vendo as mudanças anteriores person = Person.first person.name = "Alan Garner" person.save #=> Clears out current changes. # Vê mudanças anteriores person.previous_changes #=> { "name" => [ "Alan Parsons", "Alan Garner" ] }
57. Herança class Canvas include Mongoid::Document field :name, type: String embeds_many :shapes end class Browser < Canvas field :version, type: Integer scope :recent, where(:version.gt => 3) end class Firefox < Browser end
58. Herança class Shape include Mongoid::Document field :x, type: Integer field :y, type: Integer embedded_in :canvas end class Circle < Shape field :radius, type: Float end class Rectangle < Shape field :width, type: Float field :height, type: Float end
59.
60. Model.create # Insere um novo poeta na base. Person.create(first_name: "Heinrich", last_name: "Heine") # Isto também pode ser feito usando um bloco Person.create(first_name: "Heinrich") do |doc| doc.last_name = "Heine" end collections[”citizens"].insert({ "_id" : ..., "first_name" : "Heinrich", "last_name" : "Heine” })
61. Model.create! # Insere um novo poeta na base, levantando um erro # se a validação falhar. Person.create!(first_name: "Heinrich", last_name: "Heine") # Isto também pode ser feito usando um bloco Person.create!(first_name: "Heinrich") do |doc| doc.last_name = "Heine" end collections[”citizens"].insert({ "_id" : ..., "first_name" : "Heinrich", "last_name" : "Heine” })
62. Model#save # Insere um novo poeta na base. person = Person.new(first_name: "Heinrich", last_name: "Heine") person.save # Grava sem executar as validações person.save(validate: false) # Grava os campos modificados de um documento existente person.first_name = "Christian Johan" person.save # Comando de inserção de um novo documento collections[”sitizens"].insert({ "_id" : ..., "first_name" : "Heinrich", "last_name" : "Heine” }) # Comando de atualização do doc modificado collections["people"].update({ { "_id" : ... }, { "$set" : { "first_name" : "Christian Johan” } } })
63. Model#save! # Insere um novo poeta na base. person = Person.new(first_name: "Heinrich", last_name: "Heine") person.save! # Grava os campos modificados de um documento existente person.first_name = "Christian Johan" person.save! # Comando de inserção de um novo documento collections[”sitizens"].insert({ "_id" : ..., "first_name" : "Heinrich", "last_name" : "Heine” }) # Comando de atualização do doc modificado collections["people"].update({ { "_id" : ... }, { "$set" : { "first_name" : "Christian Johan” } } })
64. Model#update_attributes # Update the provided attributes. person.update_attributes(first_name: "Jean", last_name: "Zorg") # Comando de atualização do doc modificado collections[”citizens"].update({ "_id" : ..., "first_name" : ”Jean", "last_name" : ”Zorg” })
65. Model#update_attributes! # Update the provided attributes. person.update_attributes!(first_name: "Jean", last_name: "Zorg") # Comando de atualização do doc modificado collections[”citizens"].update({ "_id" : ..., "first_name" : ”Jean", "last_name" : ”Zorg” })
66. Model#update_attribute # Update the provided attributes. person.update_attribute(first_name: "Jean") # Comando de atualização do doc modificado collections[”citizens"].update({ "_id" : ..., "first_name" : ”Jean” })
69. Model#delete_all # Apaga todos os documentos da coleção Person.delete_all # Apaga todos os documentos da coleção que satisfaçam a condição Person.delete_all(conditions: { first_name: "Heinrich" }) # Comando para apagar todos collections[”citizens"].remove # Comando para apagar docs que satisfaçam condição collections[”citizens"].remove("first_name" : "Heinrich")
70. Model#destroy_all # Apaga todos os documentos da coleção Person.destroy_all # Apaga todos os documentos da coleção que satisfaçam a condição Person.destroy_all(conditions: { first_name: "Heinrich" }) # Comando para apagar todos collections[”citizens"].remove # Comando para apagar docs que satisfaçam condição collections[”citizens"].remove("first_name" : "Heinrich")
78. Model.all_in | Criteria#all_in # Traz todas as pessoas que tem Bond e 007 como aliases Person.all_in(aliases: [ "Bond", "007" ]) { "aliases" : { "$all" : [ "Bond", "007" ] }}
79. Model.also_in | Criteria#also_in # Traz pessoas com aliases igual a Bond ou 007 Person.also_in(aliases: [ "Bond", "007" ]) Person.any_in(aliases: [ "Bond" ]).also_in(aliases: [ "007" ]) { "aliases" : { "$in" : [ "Bond", "007" ] }}
80. Criteria#and # Traz todas as pessoas com last_name Jordan e first_name iniciando com d Person.where(last_name: "Jordan").and(first_name: /^d/i) { "last_name" : "Jordan", "first_name" : /^d/i }
81. Model.any_in | Criteria#any_in # Traz todas as pessoas com Bond e/ou 007 como aliases Person.any_in(aliases: [ "Bond", "007" ]) Person. any_in(aliases: [ "Bond", "007", "James" ]). any_in(aliases: [ "Bond", "007" ]) { "aliases" : { "$in" : [ "Bond", "007" ] }}
82. Model.any_of | Criteria#any_of # Traz todas as pessoas com last_name Penn ou Teller Person.any_of({ last_name: "Penn" }, { last_name: "Teller" }) { "last_name" : { "$or" : [ { "last_name" : "Penn" }, { "last_name" : "Teller" } ] } }
83. Model.asc | Criteria#asc # Retorna pessoas ordenadas por first_name e last_name em ordem alfabética crescente Person.asc(:first_name, :last_name) Person.ascending(:first_name, :last_name) { "sort" : {[ [ "first_name", Mongo::ASCENDING ], [ "last_name", Mongo::ASCENDING ] ]} }
84. Model.where | Criteria#where # Traz todas as pessocas com first_name Emmanuel Person.where(first_name: "Emmanuel") # Traz todas as pessoas com first_name Emmanuel usando Javascript. Person.where("this.first_name == 'Emmanuel'") # Traz todas as pessoas de Berlin, onde address é “embutido” Person.where("addresses.city" => "Berlin") { "first_name" : "Emmanuel" } { "$where" : "this.first_name == 'Emmanuel'" } { "addresses.city" : "Berlin" }
87. Criação # Cria uma pessoa com title Sir e first_name Lancelot e a persiste Person.where(title: "Sir", first_name: "Lancelot").create Person.where(title: "Sir").create(first_name: "Lancelot") # Constrói uma pessoa com title Sir e first_name Lancelot, sem salvá-la Person.where(title: "Sir", first_name: "Lancelot").build Person.where(title: "Sir").build(first_name: "Lancelot")
88. Atualização # Atualiza todas as pessoas que têm last_name Oldman com um novo first_name Person.where(last_name: "Oldman").update_all( first_name: "Pappa Gary" )
89. Remoção # Apaga todos os cavaleiros de Sir Arthur da base Person.where(title: "Sir").and(king: "Arthur").delete_all Person.where(title: "Sir", king: "Arthur").destroy_all
90.
91. Model.all # Encontra todas as pessoas pelas condições e opções compatíveis com MongoDB Person.all Person.all(conditions: { first_name: /^dur/i, "addresses.city" => "Berlin" }) Person.all(conditions: { title: "Sir" }, limit: 5) Person.all(sort: [[ :first_name, :asc ]])
92. Model.count # Obtém o montante de documentos que satisfazem a(s) condição(ões) Person.count Person.count(conditions: { title: "Sir" })
93. Model.exists? # Existe algum documento na base que satisfaça a(s) condição(ões)? Person.exists? Person.exists?(conditions: { title: "Sir" })
94. Model.find | Criteria#find #Permite encontrar um vários documentos pelo id Person.find(id) Person.find("4baa56f1230048567300485c") Person.where(last_name: "Black").find(id) Person.find([id_one, id_two]) Person.find(["4baa56f1230048567300485c","4baa56f1230048567300485d"]) Person.where(last_name: "Black").find([ id_one, id_two ])
95. Model.find_or_create_by # Encontra um documento que satisfaça a condição ou cria um novo, se não houver nada persistido Person.find_or_create_by(first_name: "Syd", last_name: "Vicious")
96. Model.find_or_initialize_by # Encontra um documento que satisfaça a condição ou inicializa um novo, se não houver nada persistido Person.find_or_initialize_by(first_name: "Syd", last_name: "Vicious")
97. Model.first # Encontra o primeiro documento da base que satisfaça a condição. Retorna um documento ou nil, se nada for encontrado. Pode-se definir a ordenação, a fim de se ditar qual documento deve ser retornado. Person.first(conditions: { first_name: "Syd" }) Person.first(sort: [[ :first_name, :asc ]])
98. Model.last # Encontra o último documento da base que satisfaça a condição. Retorna um documento ou nil, se nada for encontrado. Pode-se definir a ordenação, a fim de se ditar qual documento deve ser retornado. Person.last(conditions: { first_name: "Syd" }) Person.last(sort: [[ :first_name, :asc ]])
99.
100. Named Scopes class Person include Mongoid::Document field :occupation, type : String field :age, type : Integer scope :rock_n_rolla, where ( occupation : "Rockstar") scope :washed_up, where (:age. gt => 30) scope :over, ->( limit ) { where (:age .gt => limit ) } end # Encontra todos os roqueiros Person.rock_n_rolla # Econtra os roqueiros que já deviam ter parado Person.washed_up.rock_n_rolla # Encontra o Tremendão Person.rock_n_rolla.over(60) scope :current, where(:start_date.lte => Date.today) scope :current, -> { where(:start_date.lte => Date.today) }
101. Métodos de Classe # Encontra todos os roqueiros Person.rock_n_rolla # Econtra os roqueiros que já deviam ter parado Person.washed_up.rock_n_rolla # Encontra o Tremendão Person.rock_n_rolla.over(60) class Person include Mongoid::Document field :occupation, type : String field :age, type : Integer class << self def rock_n_rolla where ( occupation : "Rockstar") end def washed_up where (:age. gt => 30) end def over ( limit ) where (:age. gt => limit ) end end end
102. Métodos de Classe e Named Scopes Person.rock_n_rolla Person.washed_up.rock_n_rolla Person.rock_n_rolla.over(60) class Person include Mongoid::Document field :occupation, type : String field :age, type : Integer scope :washed_up, where (:age. gt => 30) scope :over, ->( limit ) { where (:age .gt => limit ) } class self. rock_n_rolla where ( occupation : "Rockstar") end end
103. Default Scopes # Econtra os roqueiros que já deviam ter parado Person.washed_up # Se quiser encontrar os mais velhos que não são roqueiros Person.unscoped.washed_up class Person include Mongoid::Document field :occupation, type : String field :age, type : Integer default_scope where ( occupation : "Rockstar") scope :washed_up, where (:age. gt => 30) end
104.
105.
106. Callbacks class Article include Mongoid::Document field :name, type: String set_callback(:save, :before) do |document| document.generate_slug end protected def generate_slug self.slug = name.to_permalink end end class Article include Mongoid::Document field :name, type: String field :body, type: String field :slug, type: String before_create :generate_slug protected def generate_slug self.slug = name.to_permalink end end
107.
108. Mapeamento class AuditObserver < Mongoid::Observer observe :account, :balance def after_update(record) AuditTrail.new(record, "UPDATED") end end