DESENVOLVENDO COM
     MONGODB
QUEM SOU EU?
•   Thiago Avelino

•   Socio da empresa Trianguli Consultoria Web

•   Desenvolvedor Python

•   Gerente de Projeto

•   Commiter em alguns projetos

    •   MongoDB

    •   MongoEngine

    •   CentOS (Kernel)
PRÓS MONGODB

•   Tipagem dinâmica

•   Migrações

•   Flexibilidade

•   Cache

•   BSON
Documentos
Documentos
DOCUMENTO
O documento do MongoDB é criado a partir de um JSON.

Exemplo:



  {
      nome: ‘Thiago Avelino’,
      liguagem: ‘Python’,
      database: ‘MongoDB’
  }
Migração
MIGRAÇÃO
Atualizando a estrutura de dados dinamicamente


  {
      nome: ‘Thiago Avelino’,
      liguagem: ‘Python’,
      database: ‘MongoDB’
  }



  {
      nome: ‘Thiago Avelino’,
      liguagem: [‘Python’, ‘Go’, ‘C’, ‘C++’, ‘Ruby’],
      database: [‘MongoDB’, ‘PostgreSQL’, ‘MySQL’]
  }
AGREGADOR
Distintos


  > db.tdc2011.insert({linguagem: ‘Python’})
  > db.tdc2011.insert({linguagem: ‘C’})
  > db.tdc2011.insert({linguagem: ‘C++’})
  > db.tdc2011.insert({linguagem: ‘Ruby’})

  > db.tdc2011.distinct(‘linguagem’)
  [ "python", "c", "c++" ]
map-reduce
MAP-REDUCE
Operações destinadas a manipulação grande conjuntos de informações

  function () {
    this.linguagem.forEach(function(z) {
       emit(z, 1);
     });
  }

  function (key, values) {
     var total = 0;
     for (var i = 0; i < values.length; i++) {
        total += values[i];
     }
     return total;
  }
desenvolvendo
PYTHON
Exemplo
  >>> from pymongo import Connection
  >>> con = Connection
  >>> db = con[‘tdc2011’]
  >>>
  >>> tdc = {nome: ‘Thiago Avelino’,
                 liguagem: [‘Python’, ‘Go’, ‘C’, ‘C++’, ‘Ruby’],
                 database: [‘MongoDB’, ‘PostgreSQL’, ‘MySQL’]}
  >>> db.tdc2011.insert(tdc)
  ObjectId(‘4d2e48e7cc9374271b02247a’)
  >>>
  >>> db.tdc2011.find_one({})
  >>> {u‘_id’: ObjectId(‘4d2e48e7cc9374271b02247a’),u‘nome’: u‘Thiago
  Avelino’, u‘linguagem’: [u‘Python’,u’c’,u’c++’], u’database’: [‘MongoDB’,
  ‘PostgreSQL’, ‘MySQL’]}
ORM
PYTHON ORM
Montando models com MongoEngine



  class Cadastro(Document):
     nome = StringField(required = True, max_length = 200)
     twitter = StringField(max_length = 25)


  class Caracteristicas(Cadastro):
     linguagem = ListField(StringField(max_length = 50))
     database = ListField(StringField(max_length = 50))
PYTHON ORM
Fazendo insert com MongoEngine



    >>> add1 = Cadastro(nome = ‘Thiago Avelino’, twitter = ‘avelino0’)
    >>> add1.linguagem = [‘Python’, ‘C’, ‘C++’, ‘Ruby’]
    >>> add1.database = [‘MongoDB’, ‘PostgreSQL’, ‘MySQL’]
    >>> add1.save()

    >>> add2 = Cadastro(nome = ‘Lerolero’)
    >>> add2.linguagem = [‘Ruby’]
    >>> add2.database = [‘PostgreSQL’]
    >>> add2.save()
PYTHON ORM
Buscando informações via Objeto

     >>> for cad in Cadastro.objects:
     ...      print cad.nome
     ...      if isinstance(cad, Caracteristicas):
     ...        print ‘Twitter: @%s’ % cad.twitter
     ...      print ‘====’
     ...
     Thiago Avelino
     Twitter: @avelino0
     ====
     Lerolero
     ====
PYTHON ORM
Buscando informações via Objeto em lista




     >>> len(Caracteristicas.objects(database = ‘mongodb’))
     1
     >>> len(Caracteristicas.objects(database = ‘PostgreSQL’))
     2
PYTHON ORM
GridFS
  class Img(Document):
     nome = StringField(required = True, max_length = 50)
     photo = FileField()

    >>> i = Img(nome = ‘Python’)
    >>> photo_py = open(‘python.png’, ‘r’)
    >>> i.photo = photo_py
    >>> i.photo.content_type = ‘image/png’
    >>> i.save()

    >>> i = Img.object(nome = ‘Python’).first()
    >>> photo = i.photo.read()
    >>> content_type = i.photo.content_type
MiniMongo   ...
RUBY
Exemplo

  require ‘rubygems’
  require ‘mongo’

  coll = Mongo::Connection.new.db(‘tdc2011’)

  doc = {‘nome’ => ‘Avelino’, ‘linguagem’ => ‘Ruby’}

  coll.insert(doc)

  doc[‘nome’] = ‘Thiago Avelino’
  coll.update({‘_id’ => doc[‘_id’]}, doc)

  coll.find({‘linguagem’ => ‘Ruby’})
RUBY MONGOMAPPER
Exemplo
  class Cadastro
    include MongoMapper::Document

   key :nome, String
   key :linguagem, String

  end


  cad = Cadastro.new(:nome => ‘Thiago Avelino’, :linguagem => ‘Ruby’)

  cad.save!

  Cadastro.where(:linguagem => ‘Ruby’).first
RUBY ORM

•   MongoID

•   MongoMapper

•   MongoODM (Brasileiro)

•   ...
CASE
MONITOR DE MIDIA SOCIAL
CASE
MONITOR DE MIDIA SOCIAL
CASE
MONITOR DE MIDIA SOCIAL
CASE
MONITOR DE MIDIA SOCIAL
CASE
GAME USANDO MONGODB
CASE
GAME USANDO MONGODB
OBRIGADO!
PERGUNTAS?

  Thiago Avelino
 thiago@avelino.us
  www.avelino.us
     @avelino0

Desenvolvendo com mongodb

  • 1.
  • 2.
    QUEM SOU EU? • Thiago Avelino • Socio da empresa Trianguli Consultoria Web • Desenvolvedor Python • Gerente de Projeto • Commiter em alguns projetos • MongoDB • MongoEngine • CentOS (Kernel)
  • 4.
    PRÓS MONGODB • Tipagem dinâmica • Migrações • Flexibilidade • Cache • BSON
  • 5.
  • 6.
  • 7.
    DOCUMENTO O documento doMongoDB é criado a partir de um JSON. Exemplo: { nome: ‘Thiago Avelino’, liguagem: ‘Python’, database: ‘MongoDB’ }
  • 8.
  • 9.
    MIGRAÇÃO Atualizando a estruturade dados dinamicamente { nome: ‘Thiago Avelino’, liguagem: ‘Python’, database: ‘MongoDB’ } { nome: ‘Thiago Avelino’, liguagem: [‘Python’, ‘Go’, ‘C’, ‘C++’, ‘Ruby’], database: [‘MongoDB’, ‘PostgreSQL’, ‘MySQL’] }
  • 10.
    AGREGADOR Distintos >db.tdc2011.insert({linguagem: ‘Python’}) > db.tdc2011.insert({linguagem: ‘C’}) > db.tdc2011.insert({linguagem: ‘C++’}) > db.tdc2011.insert({linguagem: ‘Ruby’}) > db.tdc2011.distinct(‘linguagem’) [ "python", "c", "c++" ]
  • 11.
  • 12.
    MAP-REDUCE Operações destinadas amanipulação grande conjuntos de informações function () { this.linguagem.forEach(function(z) { emit(z, 1); }); } function (key, values) { var total = 0; for (var i = 0; i < values.length; i++) { total += values[i]; } return total; }
  • 13.
  • 15.
    PYTHON Exemplo >>>from pymongo import Connection >>> con = Connection >>> db = con[‘tdc2011’] >>> >>> tdc = {nome: ‘Thiago Avelino’, liguagem: [‘Python’, ‘Go’, ‘C’, ‘C++’, ‘Ruby’], database: [‘MongoDB’, ‘PostgreSQL’, ‘MySQL’]} >>> db.tdc2011.insert(tdc) ObjectId(‘4d2e48e7cc9374271b02247a’) >>> >>> db.tdc2011.find_one({}) >>> {u‘_id’: ObjectId(‘4d2e48e7cc9374271b02247a’),u‘nome’: u‘Thiago Avelino’, u‘linguagem’: [u‘Python’,u’c’,u’c++’], u’database’: [‘MongoDB’, ‘PostgreSQL’, ‘MySQL’]}
  • 16.
  • 17.
    PYTHON ORM Montando modelscom MongoEngine class Cadastro(Document): nome = StringField(required = True, max_length = 200) twitter = StringField(max_length = 25) class Caracteristicas(Cadastro): linguagem = ListField(StringField(max_length = 50)) database = ListField(StringField(max_length = 50))
  • 18.
    PYTHON ORM Fazendo insertcom MongoEngine >>> add1 = Cadastro(nome = ‘Thiago Avelino’, twitter = ‘avelino0’) >>> add1.linguagem = [‘Python’, ‘C’, ‘C++’, ‘Ruby’] >>> add1.database = [‘MongoDB’, ‘PostgreSQL’, ‘MySQL’] >>> add1.save() >>> add2 = Cadastro(nome = ‘Lerolero’) >>> add2.linguagem = [‘Ruby’] >>> add2.database = [‘PostgreSQL’] >>> add2.save()
  • 19.
    PYTHON ORM Buscando informaçõesvia Objeto >>> for cad in Cadastro.objects: ... print cad.nome ... if isinstance(cad, Caracteristicas): ... print ‘Twitter: @%s’ % cad.twitter ... print ‘====’ ... Thiago Avelino Twitter: @avelino0 ==== Lerolero ====
  • 20.
    PYTHON ORM Buscando informaçõesvia Objeto em lista >>> len(Caracteristicas.objects(database = ‘mongodb’)) 1 >>> len(Caracteristicas.objects(database = ‘PostgreSQL’)) 2
  • 21.
    PYTHON ORM GridFS class Img(Document): nome = StringField(required = True, max_length = 50) photo = FileField() >>> i = Img(nome = ‘Python’) >>> photo_py = open(‘python.png’, ‘r’) >>> i.photo = photo_py >>> i.photo.content_type = ‘image/png’ >>> i.save() >>> i = Img.object(nome = ‘Python’).first() >>> photo = i.photo.read() >>> content_type = i.photo.content_type
  • 22.
  • 24.
    RUBY Exemplo require‘rubygems’ require ‘mongo’ coll = Mongo::Connection.new.db(‘tdc2011’) doc = {‘nome’ => ‘Avelino’, ‘linguagem’ => ‘Ruby’} coll.insert(doc) doc[‘nome’] = ‘Thiago Avelino’ coll.update({‘_id’ => doc[‘_id’]}, doc) coll.find({‘linguagem’ => ‘Ruby’})
  • 25.
    RUBY MONGOMAPPER Exemplo class Cadastro include MongoMapper::Document key :nome, String key :linguagem, String end cad = Cadastro.new(:nome => ‘Thiago Avelino’, :linguagem => ‘Ruby’) cad.save! Cadastro.where(:linguagem => ‘Ruby’).first
  • 26.
    RUBY ORM • MongoID • MongoMapper • MongoODM (Brasileiro) • ...
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
    OBRIGADO! PERGUNTAS? ThiagoAvelino thiago@avelino.us www.avelino.us @avelino0