SlideShare uma empresa Scribd logo
1 de 110
Eduardo Nicola F. Zagari
Sumário ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Sumário ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Sumário ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Características ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Instalando MongoDB ,[object Object],[object Object],$ curl  http://downloads.mongodb.org/osx/mongodb-osx-i386-x.y.z.tgz  > mongo.tgz $ tar xzf mongo.tgz $ sudo mkdir –p /data/db $ sudo chmod 777 /data/db
Instalação MongoDB ,[object Object],[object Object],[object Object],$ ./mongodb-XXXXXXX /bin/mongod ,[object Object],[object Object],[object Object]
Mapeamento SQL    MongoDB
Conexão com Banco via shell ,[object Object],[object Object],$ /Applications/mongodb-osx-x86_64-1.8.2/bin/mongo MongoDB shell version: 1.8.2 connecting to: test > use mydb switched to db mydb > show dbs admin (empty) local (empty) test 0.203125GB
Schema Dinâmico (Schema Free) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Inserção de Dados > j = { name : "mongo" }; {"name" : "mongo"} > t = { x : 3 }; { "x" : 3  } > db.things.save(j); > db.things.save(t); > db.things.find(); { "_id" : ObjectId(" 4e47fae21373c8f77f7ee955 "), "name" : "mongo" } { "_id" : ObjectId(" 4e47faeb1373c8f77f7ee956 "), "x" : 3 } ,[object Object],[object Object],[object Object],[object Object]
Inserção de mais dados > for (var i = 1; i <= 20; i++) db.things.save({x : 4, j : i}); > db.things.find()  { &quot;_id&quot; : ObjectId(&quot;4e47fae21373c8f77f7ee955&quot;), &quot;name&quot; : &quot;mongo&quot; } { &quot;_id&quot; : ObjectId(&quot;4e47faeb1373c8f77f7ee956&quot;), &quot;x&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee957&quot;), &quot;x&quot; : 4, &quot;j&quot; : 1 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee958&quot;), &quot;x&quot; : 4, &quot;j&quot; : 2 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee959&quot;), &quot;x&quot; : 4, &quot;j&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee95a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 4 } … { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee963&quot;), &quot;x&quot; : 4, &quot;j&quot; : 13 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee964&quot;), &quot;x&quot; : 4, &quot;j&quot; : 14 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee965&quot;), &quot;x&quot; : 4, &quot;j&quot; : 15 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee966&quot;), &quot;x&quot; : 4, &quot;j&quot; : 16 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee967&quot;), &quot;x&quot; : 4, &quot;j&quot; : 17 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee968&quot;), &quot;x&quot; : 4, &quot;j&quot; : 18 } has more
O Comando “it” (iterador) … { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee967&quot;), &quot;x&quot; : 4, &quot;j&quot; : 17 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee968&quot;), &quot;x&quot; : 4, &quot;j&quot; : 18 } has more > it { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee969&quot;), &quot;x&quot; : 4, &quot;j&quot; : 19 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee96a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 20 }
Acessando dados a partir de uma Query (objeto “cursor”) > var cur = db.things.find() > while (cur.hasNext()) printjson(cur.next()); { &quot;_id&quot; : ObjectId(&quot;4e47fae21373c8f77f7ee955&quot;), &quot;name&quot; : &quot;mongo&quot; } { &quot;_id&quot; : ObjectId(&quot;4e47faeb1373c8f77f7ee956&quot;), &quot;x&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee957&quot;), &quot;x&quot; : 4, &quot;j&quot; : 1 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee958&quot;), &quot;x&quot; : 4, &quot;j&quot; : 2 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee959&quot;), &quot;x&quot; : 4, &quot;j&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee95a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 4 } … { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee965&quot;), &quot;x&quot; : 4, &quot;j&quot; : 15 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee966&quot;), &quot;x&quot; : 4, &quot;j&quot; : 16 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee967&quot;), &quot;x&quot; : 4, &quot;j&quot; : 17 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee968&quot;), &quot;x&quot; : 4, &quot;j&quot; : 18 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee969&quot;), &quot;x&quot; : 4, &quot;j&quot; : 19 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee96a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 20 }
forEach() ao invés de while() > db.things.find().forEach(printjson);  { &quot;_id&quot; : ObjectId(&quot;4e47fae21373c8f77f7ee955&quot;), &quot;name&quot; : &quot;mongo&quot; } { &quot;_id&quot; : ObjectId(&quot;4e47faeb1373c8f77f7ee956&quot;), &quot;x&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee957&quot;), &quot;x&quot; : 4, &quot;j&quot; : 1 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee958&quot;), &quot;x&quot; : 4, &quot;j&quot; : 2 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee959&quot;), &quot;x&quot; : 4, &quot;j&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee95a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 4 } … { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee965&quot;), &quot;x&quot; : 4, &quot;j&quot; : 15 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee966&quot;), &quot;x&quot; : 4, &quot;j&quot; : 16 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee967&quot;), &quot;x&quot; : 4, &quot;j&quot; : 17 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee968&quot;), &quot;x&quot; : 4, &quot;j&quot; : 18 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee969&quot;), &quot;x&quot; : 4, &quot;j&quot; : 19 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee96a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 20 }
Tratando cursor no estilo array ,[object Object],[object Object],> var cur = db.things.find(); > printjson(cur[4]);  { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee959&quot;), &quot;x&quot; : 4, &quot;j&quot; : 3 }
Convertendo cursor em array ,[object Object],[object Object],[object Object],> var arr = db.things.find().toArray(); > arr[5]; { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee95a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 4 }
Especificando retorno de Queries ,[object Object],[object Object],> db.things.find( {name:&quot;mongo&quot;} ).forEach(printjson); { &quot;_id&quot; : ObjectId(&quot;4e47fae21373c8f77f7ee955&quot;), &quot;name&quot; : &quot;mongo&quot; }
Especificando retorno de Queries > db.things.find( {x:4} ).forEach(printjson); { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee957&quot;), &quot;x&quot; : 4, &quot;j&quot; : 1 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee958&quot;), &quot;x&quot; : 4, &quot;j&quot; : 2 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee959&quot;), &quot;x&quot; : 4, &quot;j&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee95a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 4 } … { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee965&quot;), &quot;x&quot; : 4, &quot;j&quot; : 15 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee966&quot;), &quot;x&quot; : 4, &quot;j&quot; : 16 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee967&quot;), &quot;x&quot; : 4, &quot;j&quot; : 17 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee968&quot;), &quot;x&quot; : 4, &quot;j&quot; : 18 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee969&quot;), &quot;x&quot; : 4, &quot;j&quot; : 19 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee96a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 20 }
Especificando retorno de Queries > db.things.find( {x:4} ,  {j:true} ).forEach(printjson); { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee957&quot;), &quot;j&quot; : 1 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee958&quot;), &quot;j&quot; : 2 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee959&quot;), &quot;j&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee95a&quot;), &quot;j&quot; : 4 } … { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee965&quot;), &quot;j&quot; : 15 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee966&quot;), &quot;j&quot; : 16 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee967&quot;), &quot;j&quot; : 17 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee968&quot;), &quot;j&quot; : 18 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee969&quot;), &quot;j&quot; : 19 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee96a&quot;), &quot;j&quot; : 20 } Partial Documents
findOne( ) – Syntactic Sugar ,[object Object],[object Object],[object Object],[object Object],[object Object],> printjson(db.things. findOne({j:4}) );  { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee95a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 4 }
limit( ): limitando o retorno > db.things.find(). limit(3) ; { &quot;_id&quot; : ObjectId(&quot;4e47fae21373c8f77f7ee955&quot;), &quot;name&quot; : &quot;mongo&quot; } { &quot;_id&quot; : ObjectId(&quot;4e47faeb1373c8f77f7ee956&quot;), &quot;x&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee957&quot;), &quot;x&quot; : 4, &quot;j&quot; : 1 }
Sintaxe
Sintaxe
Sintaxe
Sintaxe
Sintaxe
MongoDB Ruby Driver ,[object Object],[object Object],[object Object],[object Object]
Instalação ,[object Object],[object Object],[object Object],$ gem update --system $ gem install mongo $ gem install bson_ext
Iniciando… ,[object Object],[object Object],require 'rubygems'  # not necessary for Ruby 1.9 require 'mongo' db = Mongo::Connection.new.db(&quot;mydb&quot;) db = Mongo::Connection.new(&quot;localhost&quot;).db(&quot;mydb&quot;) db = Mongo::Connection.new(&quot;localhost&quot;, 27017).db(&quot;mydb”)
Iniciando… ,[object Object],[object Object],connection = Mongo::Connection.new # (optional host/port args) connection.database_names.each { |name| puts name } connection.database_info.each { |info| puts info.inspect} connection.drop_database('database_name’)
Iniciando ,[object Object],[object Object],[object Object],db.collection_names.each { |name| puts name } coll = db.collection(&quot;topicos&quot;) coll = db[”topicos&quot;]
Inserção de documentos { &quot;name&quot; : &quot;MongoDB&quot;, &quot;type&quot; : &quot;database&quot;, &quot;faculdade&quot; : &quot;Fecomp&quot; &quot;count&quot; : 1, &quot;info&quot; : { x : 203, y : 102 } } doc = {&quot;name&quot; => &quot;MongoDB&quot;, &quot;type&quot; => &quot;database&quot;, &quot;count&quot; => 1, &quot;faculdade&quot; => &quot;FECOMP&quot;, &quot;info&quot; => {&quot;x&quot; => 203, &quot;y&quot; => 102} } coll.insert(doc)
Atualização de documentos ,[object Object],[object Object],[object Object],coll.update({&quot;_id&quot; => doc[:_id]}, {&quot;$set&quot; => {&quot;name&quot; => &quot;MongoDB Ruby&quot;}}) doc[&quot;name&quot;] = &quot;MongoDB Ruby&quot; coll.update({&quot;_id&quot; => doc[:_id]}, doc)
Busca ,[object Object],[object Object],=> {&quot;_id&quot;=>BSON::ObjectId('4e78d41bed686f02d1000001'), &quot;name&quot;=>&quot;MongoDB&quot;, &quot;faculdade&quot; : &quot;Fecomp”, &quot;info&quot;=>{&quot;x&quot;=>203, &quot;y&quot;=>102}, &quot;count&quot;=>1, &quot;type&quot;=>&quot;database”} my_doc = coll.find_one() puts my_doc.inspect
Adicionando mais documentos ,[object Object],{  &quot;i&quot; : value } 100.times { |i| coll.insert(&quot;i&quot; => i) } puts coll.count()
Busca ,[object Object],[object Object],coll.find().each { |row| puts row.inspect }
Busca com Queries ,[object Object],[object Object],[object Object],coll.find(&quot;i&quot; => 71).each { |row| puts row.inspect } coll.find(&quot;i&quot; => {&quot;$gt&quot; => 50}).each { |row| puts row.inspect } coll.find(&quot;i&quot; => {&quot;$gt&quot; => 20, &quot;$lte&quot; => 30}).each { |row| puts row.inspect }
Busca com Queries ,[object Object],[object Object],[object Object],coll.find(&quot;name&quot; => /^M/).each { |row| puts row.inspect } search_string = params['search'] #Constructor Syntax coll.find({&quot;name&quot; => Regexp.new(search_string)}) # Literal syntax coll.find({&quot;name&quot; => /#{search_string}/})
Índices ,[object Object],[object Object],[object Object],coll.create_index(&quot;i&quot;) coll.create_index([[&quot;i&quot;, Mongo::DESCENDING]])
Índices ,[object Object],[object Object],[object Object],people.create_index([[&quot;loc&quot;, Mongo::GEO2D]]) people.find({&quot;loc&quot; => {&quot;$near&quot; => [50, 50]}}, {:limit => 20}).each do |p| puts p.inspect  end coll.index_information()
Mongoid ,[object Object],[object Object],[object Object]
Instalação ,[object Object],[object Object],[object Object],$ gem install mongoid host: localhost database: mydb Mongoid.load!(&quot;path/to/your/mongoid.yml&quot;) Mongoid.configure do |config| config.master = Mongo::Connection.new.db(”mydb&quot;) end
Documentos ,[object Object],[object Object],class Person include Mongoid::Document end class Person include Mongoid::Document store_in :citizens end
Campos ,[object Object],class Person include Mongoid::Document store_in :citizens field :first_name, type: String field :middle_name, type: String field :last_name, type: String end
Campos: get e set ,[object Object],[object Object],person.first_name person[:first_name] person.read_attribute(:first_name) person.first_name = ”José&quot; person[:first_name] = ”José&quot; person.write_attribute(:first_name, ”José&quot;)
Campos: get e set para vários campos ,[object Object],[object Object],person.attributes Person.new(first_name: &quot;Jean-Baptiste&quot;, middle_name: &quot;Emmanuel&quot;) person.attributes = { first_name: &quot;Jean-Baptiste&quot;, middle_name: &quot;Emmanuel&quot; } person.write_attributes( first_name: &quot;Jean-Baptiste&quot;, middle_name: &quot;Emmanuel&quot; )
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
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[&quot;x&quot;], object[&quot;y&quot;] ] end def serialize(object) { &quot;x&quot; => object[0], &quot;y&quot; => object[1] } end end
Campos Dinâmicos ,[object Object],[object Object],[object Object],[object Object],person[:gender] person.read_attribute(:gender) person[:gender] = &quot;Male&quot; person.write_attribute(:gender, &quot;Male&quot;)
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: &quot;Corbin&quot;) person.attributes = { first_name: &quot;Corbin&quot; } person.write_attributes(first_name: &quot;Corbin&quot;) # Tenta ajudar os valores, levantando um erro Person.new(first_name: &quot;Corbin&quot;, password: &quot;password&quot;) person.attributes = { first_name: &quot;Corbin&quot;, password: &quot;password&quot; } person.write_attributes(first_name: &quot;Corbin&quot;, password: &quot;password&quot;)
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: &quot;Corbin&quot;) person.attributes = { first_name: &quot;Corbin&quot; } person.write_attributes(first_name: &quot;Corbin&quot;) # Tenta ajudar os valores, levantando um erro Person.new(first_name: &quot;Corbin&quot;, password: &quot;password&quot;) person.attributes = { first_name: &quot;Corbin&quot;, password: &quot;password&quot; } person.write_attributes(first_name: &quot;Corbin&quot;, password: &quot;password&quot;)
Acesso: Overriding Person.new(first_name: &quot;Corbin&quot;) do |person| person.password = &quot;password&quot; end
Dirty Tracking person = Person.first person.name = &quot;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 #=> { &quot;name&quot; => [ &quot;Alan Parsons&quot;, &quot;Alan Garner&quot; ] } # 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 #=> [ &quot;Alan Parsons&quot;, &quot;Alan Garner&quot; ] # Obtém o valor anterior de um campo person.name_was #=> &quot;Alan Parsons&quot; class Person include Mongoid::Document field :name, type: String end
Limpando mudanças person = Person.first person.name = &quot;Alan Garner&quot; # Reinicializa o nome alterado de volta ao original person.reset_name! person.name #=> &quot;Alan Parsons&quot;
Vendo as mudanças anteriores person = Person.first person.name = &quot;Alan Garner&quot; person.save #=> Clears out current changes. # Vê mudanças anteriores person.previous_changes #=> { &quot;name&quot; => [ &quot;Alan Parsons&quot;, &quot;Alan Garner&quot; ] }
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
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
Persistência  ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Model.create # Insere um novo poeta  na base. Person.create(first_name: &quot;Heinrich&quot;, last_name: &quot;Heine&quot;) # Isto também pode ser feito usando um bloco Person.create(first_name: &quot;Heinrich&quot;) do |doc| doc.last_name = &quot;Heine&quot; end collections[”citizens&quot;].insert({ &quot;_id&quot; : ..., &quot;first_name&quot; : &quot;Heinrich&quot;, &quot;last_name&quot; : &quot;Heine” })
Model.create! # Insere um novo poeta  na base, levantando um erro  # se a validação falhar. Person.create!(first_name: &quot;Heinrich&quot;, last_name: &quot;Heine&quot;) # Isto também pode ser feito usando um bloco Person.create!(first_name: &quot;Heinrich&quot;) do |doc| doc.last_name = &quot;Heine&quot; end collections[”citizens&quot;].insert({ &quot;_id&quot; : ..., &quot;first_name&quot; : &quot;Heinrich&quot;, &quot;last_name&quot; : &quot;Heine” })
Model#save # Insere um novo poeta  na base. person = Person.new(first_name: &quot;Heinrich&quot;, last_name: &quot;Heine&quot;) person.save # Grava sem executar as validações person.save(validate: false) # Grava os campos modificados de um documento existente person.first_name = &quot;Christian Johan&quot; person.save # Comando de inserção de um novo documento collections[”sitizens&quot;].insert({ &quot;_id&quot; : ..., &quot;first_name&quot; : &quot;Heinrich&quot;, &quot;last_name&quot; : &quot;Heine” }) # Comando de atualização do doc modificado collections[&quot;people&quot;].update({ { &quot;_id&quot; : ... },  { &quot;$set&quot; : { &quot;first_name&quot; : &quot;Christian Johan” } } })
Model#save! # Insere um novo poeta  na base. person = Person.new(first_name: &quot;Heinrich&quot;, last_name: &quot;Heine&quot;) person.save! # Grava os campos modificados de um documento existente person.first_name = &quot;Christian Johan&quot; person.save! # Comando de inserção de um novo documento collections[”sitizens&quot;].insert({ &quot;_id&quot; : ..., &quot;first_name&quot; : &quot;Heinrich&quot;, &quot;last_name&quot; : &quot;Heine” }) # Comando de atualização do doc modificado collections[&quot;people&quot;].update({ { &quot;_id&quot; : ... },  { &quot;$set&quot; : { &quot;first_name&quot; : &quot;Christian Johan” } } })
Model#update_attributes # Update the provided attributes. person.update_attributes(first_name: &quot;Jean&quot;, last_name: &quot;Zorg&quot;) # Comando de atualização do doc modificado collections[”citizens&quot;].update({ &quot;_id&quot; : ..., &quot;first_name&quot; : ”Jean&quot;, &quot;last_name&quot; : ”Zorg” })
Model#update_attributes! # Update the provided attributes. person.update_attributes!(first_name: &quot;Jean&quot;, last_name: &quot;Zorg&quot;) # Comando de atualização do doc modificado collections[”citizens&quot;].update({ &quot;_id&quot; : ..., &quot;first_name&quot; : ”Jean&quot;, &quot;last_name&quot; : ”Zorg” })
Model#update_attribute # Update the provided attributes. person.update_attribute(first_name: &quot;Jean&quot;) # Comando de atualização do doc modificado collections[”citizens&quot;].update({ &quot;_id&quot; : ..., &quot;first_name&quot; : ”Jean” })
Model#delete person.delete collections[”citizens&quot;].remove(&quot;_id&quot; : ... )
Model#destroy person.destroy collections[”citizens&quot;].remove(&quot;_id&quot; : ... )
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: &quot;Heinrich&quot; }) # Comando para apagar todos collections[”citizens&quot;].remove # Comando  para apagar docs que satisfaçam condição collections[”citizens&quot;].remove(&quot;first_name&quot; : &quot;Heinrich&quot;)
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: &quot;Heinrich&quot; }) # Comando para apagar todos collections[”citizens&quot;].remove # Comando  para apagar docs que satisfaçam condição collections[”citizens&quot;].remove(&quot;first_name&quot; : &quot;Heinrich&quot;)
Atomicidade na Persistênicia ,[object Object],[object Object],[object Object],[object Object],[object Object]
Model#add_to_set person.add_to_set(:aliases, &quot;Bond&quot;) collections[”citizens&quot;].update( { &quot;_id&quot; : ... }, { &quot;$addToSet&quot; : { &quot;aliases&quot; : &quot;Bond&quot; } } )
Model#inc person.inc(:age, 1) collections[”citizens&quot;].update( { &quot;_id&quot; : ... }, { &quot;$inc&quot; : { &quot;age&quot; : 1 } } )
Model#pull_all person.pull_all(:aliases, [ &quot;Bond&quot;, &quot;James&quot; ]) collections[”citizens&quot;].update( { &quot;_id&quot; : ... }, { &quot;$pullAll&quot; : { &quot;aliases&quot; : [ &quot;Bond&quot;, &quot;James&quot; ] } } )
Model#push person.push(:aliases, &quot;007&quot;) collections[”citizens&quot;].update( { &quot;_id&quot; : ... }, { &quot;$push&quot; : { &quot;aliases&quot; : &quot;007&quot; } } )
Querying ,[object Object]
Criteria – métodos de query ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Model.all_in | Criteria#all_in # Traz todas as pessoas que tem Bond e 007 como aliases Person.all_in(aliases: [ &quot;Bond&quot;, &quot;007&quot; ]) { &quot;aliases&quot; : { &quot;$all&quot; : [ &quot;Bond&quot;, &quot;007&quot; ] }}
Model.also_in | Criteria#also_in # Traz pessoas com aliases igual a Bond ou 007 Person.also_in(aliases: [ &quot;Bond&quot;, &quot;007&quot; ]) Person.any_in(aliases: [ &quot;Bond&quot; ]).also_in(aliases: [ &quot;007&quot; ]) { &quot;aliases&quot; : { &quot;$in&quot; : [ &quot;Bond&quot;, &quot;007&quot; ] }}
Criteria#and # Traz todas as pessoas com last_name Jordan e first_name iniciando com d Person.where(last_name: &quot;Jordan&quot;).and(first_name: /^d/i) { &quot;last_name&quot; : &quot;Jordan&quot;, &quot;first_name&quot; : /^d/i }
Model.any_in | Criteria#any_in # Traz todas as pessoas com Bond e/ou 007 como aliases Person.any_in(aliases: [ &quot;Bond&quot;, &quot;007&quot; ]) Person. any_in(aliases: [ &quot;Bond&quot;, &quot;007&quot;, &quot;James&quot; ]). any_in(aliases: [ &quot;Bond&quot;, &quot;007&quot; ]) { &quot;aliases&quot; : { &quot;$in&quot; : [ &quot;Bond&quot;, &quot;007&quot; ] }}
Model.any_of | Criteria#any_of # Traz todas as pessoas com last_name Penn ou Teller Person.any_of({ last_name: &quot;Penn&quot; }, { last_name: &quot;Teller&quot; }) { &quot;last_name&quot; : { &quot;$or&quot; : [ { &quot;last_name&quot; : &quot;Penn&quot; }, { &quot;last_name&quot; : &quot;Teller&quot; } ] } }
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) { &quot;sort&quot; : {[ [ &quot;first_name&quot;, Mongo::ASCENDING ], [ &quot;last_name&quot;, Mongo::ASCENDING ] ]} }
Model.where | Criteria#where # Traz todas as pessocas com first_name Emmanuel Person.where(first_name: &quot;Emmanuel&quot;) # Traz todas as pessoas com  first_name Emmanuel usando Javascript. Person.where(&quot;this.first_name == 'Emmanuel'&quot;) # Traz todas as pessoas de Berlin, onde address é “embutido” Person.where(&quot;addresses.city&quot; => &quot;Berlin&quot;) { &quot;first_name&quot; : &quot;Emmanuel&quot; } { &quot;$where&quot; : &quot;this.first_name == 'Emmanuel'&quot; } { &quot;addresses.city&quot; : &quot;Berlin&quot; }
Model.where | Criteria#where # Exemplo de queries usando símbolo h4s para realizar critérios mais complexos Person.where(:title.all => [&quot;Sir&quot;]) Person.where(:age.exists => true) Person.where(:age.gt => 18) Person.where(:age.gte => 18) Person.where(:title.in => [&quot;Sir&quot;, &quot;Madam&quot;]) Person.where(:age.lt => 55) Person.where(:age.lte => 55) Person.where(:title.ne => &quot;Mr&quot;) Person.where(:title.nin => [&quot;Esquire&quot;]) Person.where(:aliases.size => 2) Person.where(:location.near => [ 22.50, -21.33 ]) Person.where(:location.within => { &quot;$center&quot; => [ [ 50, -40 ], 1 ] })
Criteria + Modificação ,[object Object]
Criação # Cria uma pessoa com title  Sir e first_name Lancelot e a persiste Person.where(title: &quot;Sir&quot;, first_name: &quot;Lancelot&quot;).create Person.where(title: &quot;Sir&quot;).create(first_name: &quot;Lancelot&quot;) # Constrói uma pessoa com title Sir e first_name Lancelot, sem salvá-la Person.where(title: &quot;Sir&quot;, first_name: &quot;Lancelot&quot;).build Person.where(title: &quot;Sir&quot;).build(first_name: &quot;Lancelot&quot;)
Atualização # Atualiza todas as pessoas que têm last_name Oldman com um novo first_name Person.where(last_name: &quot;Oldman&quot;).update_all( first_name: &quot;Pappa Gary&quot; )
Remoção # Apaga todos os cavaleiros de Sir Arthur da base Person.where(title: &quot;Sir&quot;).and(king: &quot;Arthur&quot;).delete_all Person.where(title: &quot;Sir&quot;, king: &quot;Arthur&quot;).destroy_all
Finders ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
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, &quot;addresses.city&quot; => &quot;Berlin&quot; }) Person.all(conditions: { title: &quot;Sir&quot; }, limit: 5) Person.all(sort: [[ :first_name, :asc ]])
Model.count # Obtém o montante de documentos que satisfazem a(s) condição(ões) Person.count Person.count(conditions: { title: &quot;Sir&quot; })
Model.exists? # Existe algum documento na base que satisfaça a(s) condição(ões)? Person.exists? Person.exists?(conditions: { title: &quot;Sir&quot; })
Model.find | Criteria#find #Permite encontrar um vários documentos pelo id Person.find(id) Person.find(&quot;4baa56f1230048567300485c&quot;) Person.where(last_name: &quot;Black&quot;).find(id) Person.find([id_one, id_two]) Person.find([&quot;4baa56f1230048567300485c&quot;,&quot;4baa56f1230048567300485d&quot;]) Person.where(last_name: &quot;Black&quot;).find([ id_one, id_two ])
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: &quot;Syd&quot;, last_name: &quot;Vicious&quot;)
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: &quot;Syd&quot;, last_name: &quot;Vicious&quot;)
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: &quot;Syd&quot; }) Person.first(sort: [[ :first_name, :asc ]])
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: &quot;Syd&quot; }) Person.last(sort: [[ :first_name, :asc ]])
Escopos ,[object Object],[object Object],[object Object]
Named Scopes class  Person include  Mongoid::Document field  :occupation,  type : String field  :age,  type : Integer scope  :rock_n_rolla,  where ( occupation : &quot;Rockstar&quot;) 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) }
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 : &quot;Rockstar&quot;) end def   washed_up where (:age. gt  => 30) end def   over ( limit ) where (:age. gt  =>  limit ) end end end
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 : &quot;Rockstar&quot;) end end
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 : &quot;Rockstar&quot;) scope  :washed_up,  where (:age. gt  => 30) end
Relacionamentos ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Callbacks ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
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
Observers ,[object Object],[object Object],class ArticleObserver < Mongoid::Observer def after_save(article) Notifications.article(&quot;admin@do.com&quot;, &quot;New article&quot;, article).deliver end end require 'article_observer' require 'audit_observer' Mongoid.observers = ArticleObserver, AuditObserver Mongoid.instantiate_observers config.mongoid.observers = :article_observer, :audit_observer Config/application.rb
Mapeamento class AuditObserver < Mongoid::Observer observe :account, :balance def after_update(record) AuditTrail.new(record, &quot;UPDATED&quot;) end end
Validations ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Fontes ,[object Object],[object Object],[object Object]

Mais conteúdo relacionado

Destaque

Padrões-06 - Padrões Arquiteturais - Microkernel
Padrões-06 - Padrões Arquiteturais - MicrokernelPadrões-06 - Padrões Arquiteturais - Microkernel
Padrões-06 - Padrões Arquiteturais - MicrokernelEduardo Nicola F. Zagari
 
Arquiteturas usando Pipes and Filters
Arquiteturas usando Pipes and FiltersArquiteturas usando Pipes and Filters
Arquiteturas usando Pipes and FiltersSergio Crespo
 
Arquitetura de Software
Arquitetura de SoftwareArquitetura de Software
Arquitetura de SoftwareAricelio Souza
 
Padrões-11 - Padrões Estruturais - Adaptador
Padrões-11 - Padrões Estruturais - AdaptadorPadrões-11 - Padrões Estruturais - Adaptador
Padrões-11 - Padrões Estruturais - AdaptadorEduardo Nicola F. Zagari
 
Padrões-08 - Padrões Criacionais - Abstract Factory
Padrões-08 - Padrões Criacionais - Abstract FactoryPadrões-08 - Padrões Criacionais - Abstract Factory
Padrões-08 - Padrões Criacionais - Abstract FactoryEduardo Nicola F. Zagari
 
Padrões-10 - Padrões Criacionais - Singleton
Padrões-10 - Padrões Criacionais - SingletonPadrões-10 - Padrões Criacionais - Singleton
Padrões-10 - Padrões Criacionais - SingletonEduardo Nicola F. Zagari
 
Padrões-12 - Padrões Estruturais - Facade
Padrões-12 - Padrões Estruturais - FacadePadrões-12 - Padrões Estruturais - Facade
Padrões-12 - Padrões Estruturais - FacadeEduardo Nicola F. Zagari
 
Padrões-09 - Padrões Criacionais - Factory Method
Padrões-09 - Padrões Criacionais - Factory MethodPadrões-09 - Padrões Criacionais - Factory Method
Padrões-09 - Padrões Criacionais - Factory MethodEduardo Nicola F. Zagari
 
SO-11 Winux: Laboratório de Sistemas Operacionais
SO-11 Winux: Laboratório de Sistemas OperacionaisSO-11 Winux: Laboratório de Sistemas Operacionais
SO-11 Winux: Laboratório de Sistemas OperacionaisEduardo Nicola F. Zagari
 
Arquitetura de Software Visão Geral
Arquitetura de Software Visão GeralArquitetura de Software Visão Geral
Arquitetura de Software Visão Geralsergiocrespo
 
Padrões-13 - Padrões Estruturais - Proxy
Padrões-13 - Padrões Estruturais - ProxyPadrões-13 - Padrões Estruturais - Proxy
Padrões-13 - Padrões Estruturais - ProxyEduardo Nicola F. Zagari
 

Destaque (20)

Padrões-06 - Padrões Arquiteturais - Microkernel
Padrões-06 - Padrões Arquiteturais - MicrokernelPadrões-06 - Padrões Arquiteturais - Microkernel
Padrões-06 - Padrões Arquiteturais - Microkernel
 
JAVA REFLETCION
JAVA REFLETCIONJAVA REFLETCION
JAVA REFLETCION
 
Arquiteturas usando Pipes and Filters
Arquiteturas usando Pipes and FiltersArquiteturas usando Pipes and Filters
Arquiteturas usando Pipes and Filters
 
Arquitetura de Software
Arquitetura de SoftwareArquitetura de Software
Arquitetura de Software
 
Padrões-01 - Introdução
Padrões-01 - IntroduçãoPadrões-01 - Introdução
Padrões-01 - Introdução
 
Padrões-11 - Padrões Estruturais - Adaptador
Padrões-11 - Padrões Estruturais - AdaptadorPadrões-11 - Padrões Estruturais - Adaptador
Padrões-11 - Padrões Estruturais - Adaptador
 
Padrões-08 - Padrões Criacionais - Abstract Factory
Padrões-08 - Padrões Criacionais - Abstract FactoryPadrões-08 - Padrões Criacionais - Abstract Factory
Padrões-08 - Padrões Criacionais - Abstract Factory
 
ICC-07 Softwares - Introdução
ICC-07 Softwares - IntroduçãoICC-07 Softwares - Introdução
ICC-07 Softwares - Introdução
 
Padrões-10 - Padrões Criacionais - Singleton
Padrões-10 - Padrões Criacionais - SingletonPadrões-10 - Padrões Criacionais - Singleton
Padrões-10 - Padrões Criacionais - Singleton
 
Padrões-12 - Padrões Estruturais - Facade
Padrões-12 - Padrões Estruturais - FacadePadrões-12 - Padrões Estruturais - Facade
Padrões-12 - Padrões Estruturais - Facade
 
Padrões-09 - Padrões Criacionais - Factory Method
Padrões-09 - Padrões Criacionais - Factory MethodPadrões-09 - Padrões Criacionais - Factory Method
Padrões-09 - Padrões Criacionais - Factory Method
 
SO-11 Winux: Laboratório de Sistemas Operacionais
SO-11 Winux: Laboratório de Sistemas OperacionaisSO-11 Winux: Laboratório de Sistemas Operacionais
SO-11 Winux: Laboratório de Sistemas Operacionais
 
Padrões-07 - Padrões Criacionais
Padrões-07 - Padrões CriacionaisPadrões-07 - Padrões Criacionais
Padrões-07 - Padrões Criacionais
 
Arquitetura de Software
Arquitetura de SoftwareArquitetura de Software
Arquitetura de Software
 
Arquitetura de Software Visão Geral
Arquitetura de Software Visão GeralArquitetura de Software Visão Geral
Arquitetura de Software Visão Geral
 
ICC-05 Álgebra Booleana
ICC-05 Álgebra BooleanaICC-05 Álgebra Booleana
ICC-05 Álgebra Booleana
 
Padrões-13 - Padrões Estruturais - Proxy
Padrões-13 - Padrões Estruturais - ProxyPadrões-13 - Padrões Estruturais - Proxy
Padrões-13 - Padrões Estruturais - Proxy
 
ICC-06 Periféricos - Introdução
ICC-06 Periféricos - IntroduçãoICC-06 Periféricos - Introdução
ICC-06 Periféricos - Introdução
 
ICC-02 Evolução dos Computadores
ICC-02 Evolução dos ComputadoresICC-02 Evolução dos Computadores
ICC-02 Evolução dos Computadores
 
ICC-01 História dos Computadores
ICC-01 História dos ComputadoresICC-01 História dos Computadores
ICC-01 História dos Computadores
 

Semelhante a Uma Breve Introdução ao MongoDB

Combinando OO e Funcional em javascript de forma prática
Combinando OO e Funcional em javascript de forma práticaCombinando OO e Funcional em javascript de forma prática
Combinando OO e Funcional em javascript de forma práticaMilfont Consulting
 
Django + extjs pelos forms
Django + extjs pelos formsDjango + extjs pelos forms
Django + extjs pelos formsMoacir Filho
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated QueryDalton Valadares
 
Java mais ágil que nunca no desenvolvimento Web
Java mais ágil que nunca no desenvolvimento WebJava mais ágil que nunca no desenvolvimento Web
Java mais ágil que nunca no desenvolvimento WebBruno Borges
 
Apps Web em Wicket e Scala no GlassFish Java EE 6
Apps Web em Wicket e Scala no GlassFish Java EE 6Apps Web em Wicket e Scala no GlassFish Java EE 6
Apps Web em Wicket e Scala no GlassFish Java EE 6Bruno Borges
 
Lib.SAPO.JS - Codebits2007
Lib.SAPO.JS  - Codebits2007Lib.SAPO.JS  - Codebits2007
Lib.SAPO.JS - Codebits2007Claudio Gamboa
 
Html5 storage api
Html5 storage apiHtml5 storage api
Html5 storage apiSuissa
 
Html5 - O futuro da Web
Html5 - O futuro da WebHtml5 - O futuro da Web
Html5 - O futuro da WebJose Berardo
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-androidAlberto Souza
 
03 - Formulários &amp; Dados
03 - Formulários &amp; Dados03 - Formulários &amp; Dados
03 - Formulários &amp; DadosMarcio Marinho
 
Apresentacao codeigniter
Apresentacao codeigniterApresentacao codeigniter
Apresentacao codeigniterAndré Tagliati
 
Melhorando a Experiência do Usuário com JavaScript e jQuery
Melhorando a Experiência do Usuário com JavaScript e jQueryMelhorando a Experiência do Usuário com JavaScript e jQuery
Melhorando a Experiência do Usuário com JavaScript e jQueryHarlley Oliveira
 

Semelhante a Uma Breve Introdução ao MongoDB (20)

Combinando OO e Funcional em javascript de forma prática
Combinando OO e Funcional em javascript de forma práticaCombinando OO e Funcional em javascript de forma prática
Combinando OO e Funcional em javascript de forma prática
 
Beagajs
BeagajsBeagajs
Beagajs
 
Django + extjs pelos forms
Django + extjs pelos formsDjango + extjs pelos forms
Django + extjs pelos forms
 
Spring Capitulo 02
Spring Capitulo 02Spring Capitulo 02
Spring Capitulo 02
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated Query
 
Java mais ágil que nunca no desenvolvimento Web
Java mais ágil que nunca no desenvolvimento WebJava mais ágil que nunca no desenvolvimento Web
Java mais ágil que nunca no desenvolvimento Web
 
Apps Web em Wicket e Scala no GlassFish Java EE 6
Apps Web em Wicket e Scala no GlassFish Java EE 6Apps Web em Wicket e Scala no GlassFish Java EE 6
Apps Web em Wicket e Scala no GlassFish Java EE 6
 
Lib.SAPO.JS - Codebits2007
Lib.SAPO.JS  - Codebits2007Lib.SAPO.JS  - Codebits2007
Lib.SAPO.JS - Codebits2007
 
Html5 storage api
Html5 storage apiHtml5 storage api
Html5 storage api
 
Html5 - O futuro da Web
Html5 - O futuro da WebHtml5 - O futuro da Web
Html5 - O futuro da Web
 
MongoDB
MongoDBMongoDB
MongoDB
 
Spring Capitulo 03
Spring Capitulo 03Spring Capitulo 03
Spring Capitulo 03
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-android
 
03 - Formulários &amp; Dados
03 - Formulários &amp; Dados03 - Formulários &amp; Dados
03 - Formulários &amp; Dados
 
Php 04 Mysql
Php 04 MysqlPhp 04 Mysql
Php 04 Mysql
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDB
 
Apresentacao codeigniter
Apresentacao codeigniterApresentacao codeigniter
Apresentacao codeigniter
 
Melhorando a Experiência do Usuário com JavaScript e jQuery
Melhorando a Experiência do Usuário com JavaScript e jQueryMelhorando a Experiência do Usuário com JavaScript e jQuery
Melhorando a Experiência do Usuário com JavaScript e jQuery
 
Palestra MongoDB
Palestra MongoDBPalestra MongoDB
Palestra MongoDB
 
PHP FrameWARks - FISL
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
 

Mais de Eduardo Nicola F. Zagari

Onix: Sistema Integrado de Gerˆencia para Redes Sobrepostas
Onix: Sistema Integrado de Gerˆencia para Redes SobrepostasOnix: Sistema Integrado de Gerˆencia para Redes Sobrepostas
Onix: Sistema Integrado de Gerˆencia para Redes SobrepostasEduardo Nicola F. Zagari
 
Uma Plataforma para Engenharia de Tráfego com Qualidade de Serviço em Redes MPLS
Uma Plataforma para Engenharia de Tráfego com Qualidade de Serviço em Redes MPLSUma Plataforma para Engenharia de Tráfego com Qualidade de Serviço em Redes MPLS
Uma Plataforma para Engenharia de Tráfego com Qualidade de Serviço em Redes MPLSEduardo Nicola F. Zagari
 
Uma Implementação do MPLS para Redes Linux
Uma Implementação do MPLS para Redes LinuxUma Implementação do MPLS para Redes Linux
Uma Implementação do MPLS para Redes LinuxEduardo Nicola F. Zagari
 
Módulo de Estudos e Treinamento em Tempo Real
Módulo de Estudos e Treinamento em Tempo RealMódulo de Estudos e Treinamento em Tempo Real
Módulo de Estudos e Treinamento em Tempo RealEduardo Nicola F. Zagari
 
Aproveitamento Funcional de Sistemas Digitais em Subestações: Funções Automát...
Aproveitamento Funcional de Sistemas Digitais em Subestações: Funções Automát...Aproveitamento Funcional de Sistemas Digitais em Subestações: Funções Automát...
Aproveitamento Funcional de Sistemas Digitais em Subestações: Funções Automát...Eduardo Nicola F. Zagari
 
Modernização e Implantação das Funções de Análise de Rede em Tempo Real no Ce...
Modernização e Implantação das Funções de Análise de Rede em Tempo Real no Ce...Modernização e Implantação das Funções de Análise de Rede em Tempo Real no Ce...
Modernização e Implantação das Funções de Análise de Rede em Tempo Real no Ce...Eduardo Nicola F. Zagari
 
Master Thesis - Zagari, Eduardo Nicola Ferraz: Escalonamento em Tempo Real da...
Master Thesis - Zagari, Eduardo Nicola Ferraz: Escalonamento em Tempo Real da...Master Thesis - Zagari, Eduardo Nicola Ferraz: Escalonamento em Tempo Real da...
Master Thesis - Zagari, Eduardo Nicola Ferraz: Escalonamento em Tempo Real da...Eduardo Nicola F. Zagari
 

Mais de Eduardo Nicola F. Zagari (11)

Introdução à Linguagem Ruby
Introdução à Linguagem RubyIntrodução à Linguagem Ruby
Introdução à Linguagem Ruby
 
Onix: Sistema Integrado de Gerˆencia para Redes Sobrepostas
Onix: Sistema Integrado de Gerˆencia para Redes SobrepostasOnix: Sistema Integrado de Gerˆencia para Redes Sobrepostas
Onix: Sistema Integrado de Gerˆencia para Redes Sobrepostas
 
Uma Plataforma para Engenharia de Tráfego com Qualidade de Serviço em Redes MPLS
Uma Plataforma para Engenharia de Tráfego com Qualidade de Serviço em Redes MPLSUma Plataforma para Engenharia de Tráfego com Qualidade de Serviço em Redes MPLS
Uma Plataforma para Engenharia de Tráfego com Qualidade de Serviço em Redes MPLS
 
Uma Implementação do MPLS para Redes Linux
Uma Implementação do MPLS para Redes LinuxUma Implementação do MPLS para Redes Linux
Uma Implementação do MPLS para Redes Linux
 
Módulo de Estudos e Treinamento em Tempo Real
Módulo de Estudos e Treinamento em Tempo RealMódulo de Estudos e Treinamento em Tempo Real
Módulo de Estudos e Treinamento em Tempo Real
 
Módulo de Estudos em Tempo Real
Módulo de Estudos em Tempo RealMódulo de Estudos em Tempo Real
Módulo de Estudos em Tempo Real
 
Aproveitamento Funcional de Sistemas Digitais em Subestações: Funções Automát...
Aproveitamento Funcional de Sistemas Digitais em Subestações: Funções Automát...Aproveitamento Funcional de Sistemas Digitais em Subestações: Funções Automát...
Aproveitamento Funcional de Sistemas Digitais em Subestações: Funções Automát...
 
Modernização e Implantação das Funções de Análise de Rede em Tempo Real no Ce...
Modernização e Implantação das Funções de Análise de Rede em Tempo Real no Ce...Modernização e Implantação das Funções de Análise de Rede em Tempo Real no Ce...
Modernização e Implantação das Funções de Análise de Rede em Tempo Real no Ce...
 
Master Thesis - Zagari, Eduardo Nicola Ferraz: Escalonamento em Tempo Real da...
Master Thesis - Zagari, Eduardo Nicola Ferraz: Escalonamento em Tempo Real da...Master Thesis - Zagari, Eduardo Nicola Ferraz: Escalonamento em Tempo Real da...
Master Thesis - Zagari, Eduardo Nicola Ferraz: Escalonamento em Tempo Real da...
 
ICC-03 Organização dos Computadores
ICC-03 Organização dos ComputadoresICC-03 Organização dos Computadores
ICC-03 Organização dos Computadores
 
ICC-04 Sistemas Numéricos
ICC-04 Sistemas NuméricosICC-04 Sistemas Numéricos
ICC-04 Sistemas Numéricos
 

Último

ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfNatalia Granato
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 

Último (6)

ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 

Uma Breve Introdução ao MongoDB

  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8. Mapeamento SQL  MongoDB
  • 9.
  • 10.
  • 11.
  • 12. Inserção de mais dados > for (var i = 1; i <= 20; i++) db.things.save({x : 4, j : i}); > db.things.find() { &quot;_id&quot; : ObjectId(&quot;4e47fae21373c8f77f7ee955&quot;), &quot;name&quot; : &quot;mongo&quot; } { &quot;_id&quot; : ObjectId(&quot;4e47faeb1373c8f77f7ee956&quot;), &quot;x&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee957&quot;), &quot;x&quot; : 4, &quot;j&quot; : 1 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee958&quot;), &quot;x&quot; : 4, &quot;j&quot; : 2 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee959&quot;), &quot;x&quot; : 4, &quot;j&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee95a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 4 } … { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee963&quot;), &quot;x&quot; : 4, &quot;j&quot; : 13 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee964&quot;), &quot;x&quot; : 4, &quot;j&quot; : 14 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee965&quot;), &quot;x&quot; : 4, &quot;j&quot; : 15 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee966&quot;), &quot;x&quot; : 4, &quot;j&quot; : 16 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee967&quot;), &quot;x&quot; : 4, &quot;j&quot; : 17 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee968&quot;), &quot;x&quot; : 4, &quot;j&quot; : 18 } has more
  • 13. O Comando “it” (iterador) … { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee967&quot;), &quot;x&quot; : 4, &quot;j&quot; : 17 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee968&quot;), &quot;x&quot; : 4, &quot;j&quot; : 18 } has more > it { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee969&quot;), &quot;x&quot; : 4, &quot;j&quot; : 19 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee96a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 20 }
  • 14. Acessando dados a partir de uma Query (objeto “cursor”) > var cur = db.things.find() > while (cur.hasNext()) printjson(cur.next()); { &quot;_id&quot; : ObjectId(&quot;4e47fae21373c8f77f7ee955&quot;), &quot;name&quot; : &quot;mongo&quot; } { &quot;_id&quot; : ObjectId(&quot;4e47faeb1373c8f77f7ee956&quot;), &quot;x&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee957&quot;), &quot;x&quot; : 4, &quot;j&quot; : 1 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee958&quot;), &quot;x&quot; : 4, &quot;j&quot; : 2 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee959&quot;), &quot;x&quot; : 4, &quot;j&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee95a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 4 } … { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee965&quot;), &quot;x&quot; : 4, &quot;j&quot; : 15 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee966&quot;), &quot;x&quot; : 4, &quot;j&quot; : 16 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee967&quot;), &quot;x&quot; : 4, &quot;j&quot; : 17 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee968&quot;), &quot;x&quot; : 4, &quot;j&quot; : 18 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee969&quot;), &quot;x&quot; : 4, &quot;j&quot; : 19 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee96a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 20 }
  • 15. forEach() ao invés de while() > db.things.find().forEach(printjson); { &quot;_id&quot; : ObjectId(&quot;4e47fae21373c8f77f7ee955&quot;), &quot;name&quot; : &quot;mongo&quot; } { &quot;_id&quot; : ObjectId(&quot;4e47faeb1373c8f77f7ee956&quot;), &quot;x&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee957&quot;), &quot;x&quot; : 4, &quot;j&quot; : 1 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee958&quot;), &quot;x&quot; : 4, &quot;j&quot; : 2 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee959&quot;), &quot;x&quot; : 4, &quot;j&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee95a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 4 } … { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee965&quot;), &quot;x&quot; : 4, &quot;j&quot; : 15 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee966&quot;), &quot;x&quot; : 4, &quot;j&quot; : 16 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee967&quot;), &quot;x&quot; : 4, &quot;j&quot; : 17 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee968&quot;), &quot;x&quot; : 4, &quot;j&quot; : 18 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee969&quot;), &quot;x&quot; : 4, &quot;j&quot; : 19 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee96a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 20 }
  • 16.
  • 17.
  • 18.
  • 19. Especificando retorno de Queries > db.things.find( {x:4} ).forEach(printjson); { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee957&quot;), &quot;x&quot; : 4, &quot;j&quot; : 1 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee958&quot;), &quot;x&quot; : 4, &quot;j&quot; : 2 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee959&quot;), &quot;x&quot; : 4, &quot;j&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee95a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 4 } … { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee965&quot;), &quot;x&quot; : 4, &quot;j&quot; : 15 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee966&quot;), &quot;x&quot; : 4, &quot;j&quot; : 16 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee967&quot;), &quot;x&quot; : 4, &quot;j&quot; : 17 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee968&quot;), &quot;x&quot; : 4, &quot;j&quot; : 18 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee969&quot;), &quot;x&quot; : 4, &quot;j&quot; : 19 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee96a&quot;), &quot;x&quot; : 4, &quot;j&quot; : 20 }
  • 20. Especificando retorno de Queries > db.things.find( {x:4} , {j:true} ).forEach(printjson); { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee957&quot;), &quot;j&quot; : 1 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee958&quot;), &quot;j&quot; : 2 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee959&quot;), &quot;j&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee95a&quot;), &quot;j&quot; : 4 } … { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee965&quot;), &quot;j&quot; : 15 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee966&quot;), &quot;j&quot; : 16 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee967&quot;), &quot;j&quot; : 17 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee968&quot;), &quot;j&quot; : 18 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee969&quot;), &quot;j&quot; : 19 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee96a&quot;), &quot;j&quot; : 20 } Partial Documents
  • 21.
  • 22. limit( ): limitando o retorno > db.things.find(). limit(3) ; { &quot;_id&quot; : ObjectId(&quot;4e47fae21373c8f77f7ee955&quot;), &quot;name&quot; : &quot;mongo&quot; } { &quot;_id&quot; : ObjectId(&quot;4e47faeb1373c8f77f7ee956&quot;), &quot;x&quot; : 3 } { &quot;_id&quot; : ObjectId(&quot;4e47fcb41373c8f77f7ee957&quot;), &quot;x&quot; : 4, &quot;j&quot; : 1 }
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33. Inserção de documentos { &quot;name&quot; : &quot;MongoDB&quot;, &quot;type&quot; : &quot;database&quot;, &quot;faculdade&quot; : &quot;Fecomp&quot; &quot;count&quot; : 1, &quot;info&quot; : { x : 203, y : 102 } } doc = {&quot;name&quot; => &quot;MongoDB&quot;, &quot;type&quot; => &quot;database&quot;, &quot;count&quot; => 1, &quot;faculdade&quot; => &quot;FECOMP&quot;, &quot;info&quot; => {&quot;x&quot; => 203, &quot;y&quot; => 102} } coll.insert(doc)
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 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[&quot;x&quot;], object[&quot;y&quot;] ] end def serialize(object) { &quot;x&quot; => object[0], &quot;y&quot; => 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: &quot;Corbin&quot;) person.attributes = { first_name: &quot;Corbin&quot; } person.write_attributes(first_name: &quot;Corbin&quot;) # Tenta ajudar os valores, levantando um erro Person.new(first_name: &quot;Corbin&quot;, password: &quot;password&quot;) person.attributes = { first_name: &quot;Corbin&quot;, password: &quot;password&quot; } person.write_attributes(first_name: &quot;Corbin&quot;, password: &quot;password&quot;)
  • 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: &quot;Corbin&quot;) person.attributes = { first_name: &quot;Corbin&quot; } person.write_attributes(first_name: &quot;Corbin&quot;) # Tenta ajudar os valores, levantando um erro Person.new(first_name: &quot;Corbin&quot;, password: &quot;password&quot;) person.attributes = { first_name: &quot;Corbin&quot;, password: &quot;password&quot; } person.write_attributes(first_name: &quot;Corbin&quot;, password: &quot;password&quot;)
  • 53. Acesso: Overriding Person.new(first_name: &quot;Corbin&quot;) do |person| person.password = &quot;password&quot; end
  • 54. Dirty Tracking person = Person.first person.name = &quot;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 #=> { &quot;name&quot; => [ &quot;Alan Parsons&quot;, &quot;Alan Garner&quot; ] } # 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 #=> [ &quot;Alan Parsons&quot;, &quot;Alan Garner&quot; ] # Obtém o valor anterior de um campo person.name_was #=> &quot;Alan Parsons&quot; class Person include Mongoid::Document field :name, type: String end
  • 55. Limpando mudanças person = Person.first person.name = &quot;Alan Garner&quot; # Reinicializa o nome alterado de volta ao original person.reset_name! person.name #=> &quot;Alan Parsons&quot;
  • 56. Vendo as mudanças anteriores person = Person.first person.name = &quot;Alan Garner&quot; person.save #=> Clears out current changes. # Vê mudanças anteriores person.previous_changes #=> { &quot;name&quot; => [ &quot;Alan Parsons&quot;, &quot;Alan Garner&quot; ] }
  • 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: &quot;Heinrich&quot;, last_name: &quot;Heine&quot;) # Isto também pode ser feito usando um bloco Person.create(first_name: &quot;Heinrich&quot;) do |doc| doc.last_name = &quot;Heine&quot; end collections[”citizens&quot;].insert({ &quot;_id&quot; : ..., &quot;first_name&quot; : &quot;Heinrich&quot;, &quot;last_name&quot; : &quot;Heine” })
  • 61. Model.create! # Insere um novo poeta na base, levantando um erro # se a validação falhar. Person.create!(first_name: &quot;Heinrich&quot;, last_name: &quot;Heine&quot;) # Isto também pode ser feito usando um bloco Person.create!(first_name: &quot;Heinrich&quot;) do |doc| doc.last_name = &quot;Heine&quot; end collections[”citizens&quot;].insert({ &quot;_id&quot; : ..., &quot;first_name&quot; : &quot;Heinrich&quot;, &quot;last_name&quot; : &quot;Heine” })
  • 62. Model#save # Insere um novo poeta na base. person = Person.new(first_name: &quot;Heinrich&quot;, last_name: &quot;Heine&quot;) person.save # Grava sem executar as validações person.save(validate: false) # Grava os campos modificados de um documento existente person.first_name = &quot;Christian Johan&quot; person.save # Comando de inserção de um novo documento collections[”sitizens&quot;].insert({ &quot;_id&quot; : ..., &quot;first_name&quot; : &quot;Heinrich&quot;, &quot;last_name&quot; : &quot;Heine” }) # Comando de atualização do doc modificado collections[&quot;people&quot;].update({ { &quot;_id&quot; : ... }, { &quot;$set&quot; : { &quot;first_name&quot; : &quot;Christian Johan” } } })
  • 63. Model#save! # Insere um novo poeta na base. person = Person.new(first_name: &quot;Heinrich&quot;, last_name: &quot;Heine&quot;) person.save! # Grava os campos modificados de um documento existente person.first_name = &quot;Christian Johan&quot; person.save! # Comando de inserção de um novo documento collections[”sitizens&quot;].insert({ &quot;_id&quot; : ..., &quot;first_name&quot; : &quot;Heinrich&quot;, &quot;last_name&quot; : &quot;Heine” }) # Comando de atualização do doc modificado collections[&quot;people&quot;].update({ { &quot;_id&quot; : ... }, { &quot;$set&quot; : { &quot;first_name&quot; : &quot;Christian Johan” } } })
  • 64. Model#update_attributes # Update the provided attributes. person.update_attributes(first_name: &quot;Jean&quot;, last_name: &quot;Zorg&quot;) # Comando de atualização do doc modificado collections[”citizens&quot;].update({ &quot;_id&quot; : ..., &quot;first_name&quot; : ”Jean&quot;, &quot;last_name&quot; : ”Zorg” })
  • 65. Model#update_attributes! # Update the provided attributes. person.update_attributes!(first_name: &quot;Jean&quot;, last_name: &quot;Zorg&quot;) # Comando de atualização do doc modificado collections[”citizens&quot;].update({ &quot;_id&quot; : ..., &quot;first_name&quot; : ”Jean&quot;, &quot;last_name&quot; : ”Zorg” })
  • 66. Model#update_attribute # Update the provided attributes. person.update_attribute(first_name: &quot;Jean&quot;) # Comando de atualização do doc modificado collections[”citizens&quot;].update({ &quot;_id&quot; : ..., &quot;first_name&quot; : ”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: &quot;Heinrich&quot; }) # Comando para apagar todos collections[”citizens&quot;].remove # Comando para apagar docs que satisfaçam condição collections[”citizens&quot;].remove(&quot;first_name&quot; : &quot;Heinrich&quot;)
  • 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: &quot;Heinrich&quot; }) # Comando para apagar todos collections[”citizens&quot;].remove # Comando para apagar docs que satisfaçam condição collections[”citizens&quot;].remove(&quot;first_name&quot; : &quot;Heinrich&quot;)
  • 71.
  • 72. Model#add_to_set person.add_to_set(:aliases, &quot;Bond&quot;) collections[”citizens&quot;].update( { &quot;_id&quot; : ... }, { &quot;$addToSet&quot; : { &quot;aliases&quot; : &quot;Bond&quot; } } )
  • 73. Model#inc person.inc(:age, 1) collections[”citizens&quot;].update( { &quot;_id&quot; : ... }, { &quot;$inc&quot; : { &quot;age&quot; : 1 } } )
  • 74. Model#pull_all person.pull_all(:aliases, [ &quot;Bond&quot;, &quot;James&quot; ]) collections[”citizens&quot;].update( { &quot;_id&quot; : ... }, { &quot;$pullAll&quot; : { &quot;aliases&quot; : [ &quot;Bond&quot;, &quot;James&quot; ] } } )
  • 75. Model#push person.push(:aliases, &quot;007&quot;) collections[”citizens&quot;].update( { &quot;_id&quot; : ... }, { &quot;$push&quot; : { &quot;aliases&quot; : &quot;007&quot; } } )
  • 76.
  • 77.
  • 78. Model.all_in | Criteria#all_in # Traz todas as pessoas que tem Bond e 007 como aliases Person.all_in(aliases: [ &quot;Bond&quot;, &quot;007&quot; ]) { &quot;aliases&quot; : { &quot;$all&quot; : [ &quot;Bond&quot;, &quot;007&quot; ] }}
  • 79. Model.also_in | Criteria#also_in # Traz pessoas com aliases igual a Bond ou 007 Person.also_in(aliases: [ &quot;Bond&quot;, &quot;007&quot; ]) Person.any_in(aliases: [ &quot;Bond&quot; ]).also_in(aliases: [ &quot;007&quot; ]) { &quot;aliases&quot; : { &quot;$in&quot; : [ &quot;Bond&quot;, &quot;007&quot; ] }}
  • 80. Criteria#and # Traz todas as pessoas com last_name Jordan e first_name iniciando com d Person.where(last_name: &quot;Jordan&quot;).and(first_name: /^d/i) { &quot;last_name&quot; : &quot;Jordan&quot;, &quot;first_name&quot; : /^d/i }
  • 81. Model.any_in | Criteria#any_in # Traz todas as pessoas com Bond e/ou 007 como aliases Person.any_in(aliases: [ &quot;Bond&quot;, &quot;007&quot; ]) Person. any_in(aliases: [ &quot;Bond&quot;, &quot;007&quot;, &quot;James&quot; ]). any_in(aliases: [ &quot;Bond&quot;, &quot;007&quot; ]) { &quot;aliases&quot; : { &quot;$in&quot; : [ &quot;Bond&quot;, &quot;007&quot; ] }}
  • 82. Model.any_of | Criteria#any_of # Traz todas as pessoas com last_name Penn ou Teller Person.any_of({ last_name: &quot;Penn&quot; }, { last_name: &quot;Teller&quot; }) { &quot;last_name&quot; : { &quot;$or&quot; : [ { &quot;last_name&quot; : &quot;Penn&quot; }, { &quot;last_name&quot; : &quot;Teller&quot; } ] } }
  • 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) { &quot;sort&quot; : {[ [ &quot;first_name&quot;, Mongo::ASCENDING ], [ &quot;last_name&quot;, Mongo::ASCENDING ] ]} }
  • 84. Model.where | Criteria#where # Traz todas as pessocas com first_name Emmanuel Person.where(first_name: &quot;Emmanuel&quot;) # Traz todas as pessoas com first_name Emmanuel usando Javascript. Person.where(&quot;this.first_name == 'Emmanuel'&quot;) # Traz todas as pessoas de Berlin, onde address é “embutido” Person.where(&quot;addresses.city&quot; => &quot;Berlin&quot;) { &quot;first_name&quot; : &quot;Emmanuel&quot; } { &quot;$where&quot; : &quot;this.first_name == 'Emmanuel'&quot; } { &quot;addresses.city&quot; : &quot;Berlin&quot; }
  • 85. Model.where | Criteria#where # Exemplo de queries usando símbolo h4s para realizar critérios mais complexos Person.where(:title.all => [&quot;Sir&quot;]) Person.where(:age.exists => true) Person.where(:age.gt => 18) Person.where(:age.gte => 18) Person.where(:title.in => [&quot;Sir&quot;, &quot;Madam&quot;]) Person.where(:age.lt => 55) Person.where(:age.lte => 55) Person.where(:title.ne => &quot;Mr&quot;) Person.where(:title.nin => [&quot;Esquire&quot;]) Person.where(:aliases.size => 2) Person.where(:location.near => [ 22.50, -21.33 ]) Person.where(:location.within => { &quot;$center&quot; => [ [ 50, -40 ], 1 ] })
  • 86.
  • 87. Criação # Cria uma pessoa com title Sir e first_name Lancelot e a persiste Person.where(title: &quot;Sir&quot;, first_name: &quot;Lancelot&quot;).create Person.where(title: &quot;Sir&quot;).create(first_name: &quot;Lancelot&quot;) # Constrói uma pessoa com title Sir e first_name Lancelot, sem salvá-la Person.where(title: &quot;Sir&quot;, first_name: &quot;Lancelot&quot;).build Person.where(title: &quot;Sir&quot;).build(first_name: &quot;Lancelot&quot;)
  • 88. Atualização # Atualiza todas as pessoas que têm last_name Oldman com um novo first_name Person.where(last_name: &quot;Oldman&quot;).update_all( first_name: &quot;Pappa Gary&quot; )
  • 89. Remoção # Apaga todos os cavaleiros de Sir Arthur da base Person.where(title: &quot;Sir&quot;).and(king: &quot;Arthur&quot;).delete_all Person.where(title: &quot;Sir&quot;, king: &quot;Arthur&quot;).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, &quot;addresses.city&quot; => &quot;Berlin&quot; }) Person.all(conditions: { title: &quot;Sir&quot; }, 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: &quot;Sir&quot; })
  • 93. Model.exists? # Existe algum documento na base que satisfaça a(s) condição(ões)? Person.exists? Person.exists?(conditions: { title: &quot;Sir&quot; })
  • 94. Model.find | Criteria#find #Permite encontrar um vários documentos pelo id Person.find(id) Person.find(&quot;4baa56f1230048567300485c&quot;) Person.where(last_name: &quot;Black&quot;).find(id) Person.find([id_one, id_two]) Person.find([&quot;4baa56f1230048567300485c&quot;,&quot;4baa56f1230048567300485d&quot;]) Person.where(last_name: &quot;Black&quot;).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: &quot;Syd&quot;, last_name: &quot;Vicious&quot;)
  • 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: &quot;Syd&quot;, last_name: &quot;Vicious&quot;)
  • 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: &quot;Syd&quot; }) 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: &quot;Syd&quot; }) 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 : &quot;Rockstar&quot;) 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 : &quot;Rockstar&quot;) 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 : &quot;Rockstar&quot;) 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 : &quot;Rockstar&quot;) 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, &quot;UPDATED&quot;) end end
  • 109.
  • 110.