MongoDB: um banco de dados orientado a documento

Julio Monteiro
Julio MonteiroSoftware Engineer
Júlio Monteiro
julio@monteiro.eti.br
/ME




Rails Developer, JobScore (http://www.jobscore.com)
/ME




http://julio.monteiro.eti.br
AGENDA
1. Objetivo

2. Histórico

3. Características

4. Relacional versus MongoDB

5. Consultas

6. Map/reduce

7. Operações atômicas

8. Índices

9. Geoposicionamento

10.Por onde continuar?
OBJETIVO


             MongoDB busca aproveitar vantagens
         de armazenamentos de chave-valor
            (que, no geral, são rápidos e escaláveis)
      e banco de dados relacionais tradicionais
(que, no geral, oferecem consultas ricas e várias funcionalidades).

                                   (Adaptado do site oficial do MongoDB)
Quando Chuck Norris fala, todos ficam em silêncio. E morrem.
HISTÓRICO

• Produto    da 10gen

• Desenvolvimento       iniciou em Outubro de 2007

• Primeira   versão pública em Fevereiro de 2009

• Atualmente    na versão 1.6

• Licenciado   sob a GNU AGPL
CARACTERÍSTICAS (1/2)

• Armazenamento      orientado a documentos

• Índices

• Consultas   ricas (rich queries)

• Atualizações   in-place rápidas

• Map/Reduce
CARACTERÍSTICAS (2/2)


• Replicação   e Alta Disponibilidade

• Auto-Sharding

• GridFS

• Suporte   Comercial (da 10gen)
RELACIONAL VERSUS
    MONGODB
TABELA
id    nome    sobrenome   idade

1     Ana        Silva     20

2     Maria    Carvalho    22

3     João      Chaves     21

4     Mário    Schimitd    30

...    ...        ...       ...
DOCUMENTO
Id: 1               Id: 2
Nome: Ana           Nome: Maria
Sobrenome: Silva    Sobrenome: Carvalho
Idade: 20           Idade: 22

Id: 3               Id: 4
Nome: João          Nome: Mário
Sobrenome: Chaves   Sobrenome: Schimitd
Idade: 21           Idade: 30
TERMINOLOGIA
Relacional Tradicional        MongoDB
   (MySQL, PostgreSQL, etc)


        Database              Database
        (Banco de dados)      (Banco de dados)


            Table             Collection
             (Tabela)            (Coleção)


            Row               Document
         (Linha, registro)     (Documento)


         Column               Attribute
            (Coluna)             (Atributo)
MODELO ENTIDADE-
 RELACIONAMENTO
      MYSQL

       artigos           comentarios


artigos_palavras_chave


   palavras_chave
MODELO ENTIDADE
  MONGODB


            comentarios
  artigos
            palavras_chave
DOCUMENTO EM
{               MONGODB
  "_id" : ObjectID("4c03e856e258c2701930c091"),
  "titulo" : "Campus Party Brasil 2011 vêm aí",
  "atalho" : "campus-party-brasil-2011-vem-ai",
  "texto" : "A Campus Party Brasil 2011 está chegando, e com elas diversas
atrações!",
  "publicado" : true,
  "criado_em" : "Mon Oct 4 2010 16:00:00 GMT-0300 (BRT)",
  "atualizado_em" : "Mon Oct 4 2010 16:00:00 GMT-0300 (BRT)",
  "comentarios" : [
     {
       "autor" : "Julio",
       "email" : "julio@monteiro.eti.br",
       "conteudo" : "Gostei muito da Campus!",
       "criado_em" : "Mon Oct 4 2010 17:00:00 GMT-0300 (BRT)"
     }
  ],
  "palavras_chave" : [ "cpbr4", "campus", "party" ]
}
JSON
JavaScript Object Notation
BJSON
Bin  ary
JavaScript Object Notation
MongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documento
CONSULTAS
COMO BUSCO...
• ... por uma palavra inteira?
  db.artigos.find({"titulo" : "campus"})

• ... por parte de uma palavra?
  db.artigos.find({"titulo" : /campus/i})

• ... por uma palavra dentro de um array?
  db.artigos.find({"palavras_chave" : "campus"})

• ... por uma palavra dentro de um embutido?
  db.artigos.find({ "comentarios.email" :
  "julio@monteiro.eti.br" })
COMO ATUALIZO...

... determinado atributo de um registro?
db.artigos.update(
  { "comentarios.email" : "julio@monteiro.eti.br" },
  { $set:
    {
      "comentarios.$.email" : "julio@awegen.com"
    }
  }
)
$SET ?
OPERADORES
$gt
          $all
$gte
          $size
$lt
          $exists
$lte
          $type
$ne
          $elemMatch
$in
          $not
$nin
          $where
$mod
USANDO OPERADORES
• Maior que ($gt):
  terceiraIdade = db.pessoas.find({ "age": { $gt:
  75 } })

• Incluindo ($in):
  interessante = db.artigos.find({ "tags" : { $in :
  ["mongodb", "interessante"] } })

• Não incluindo ($nin):
  todo = db.tarefas.find({ "status" : { $nin : [ "em
  execucao", "terminado" ] } })
FUNÇÕES ARBITRÁRIAS
• Usando funções arbitrárias (com $where):
  db.artigos.find({ $where : function() {
    return this.acessos % 2 == 0
  } })

• Usando agrupamento (com $group):
  db.artigos.group({
     "key" : { "hits" : true },
     "initial" : { "count": 0 },
     "reduce" : function(obj, prev) {
       prev.count++;
     }
  })
FUNÇÃO DE AGRUPAMENTO


• Dado que possui documentos como...
  {
    domain: "www.mongodb.org",
    invoked_at: {d:"2009-11-03", t:"17:14:05"},
    response_time: 0.05,
    http_action: "GET /display/DOCS/Aggregation"
  }
FUNÇÃO DE AGRUPAMENTO

• Agrupamento:
  db.test.group(
    { cond: {"invoked_at.d": {$gte: "2009-11", $lt:
  "2009-12"}}
    , key: {http_action: true}
    , initial: {count: 0, total_time:0}
    , reduce: function(doc, out){ out.count++;
  out.total_time+=doc.response_time }
    , finalize: function(out){ out.avg_time =
  out.total_time / out.count }
  } )
FUNÇÃO DE AGRUPAMENTO

• Retorno do agrupamento:
  [
    {
      "http_action" : "GET /display/DOCS/
  Aggregation",
      "count" : 1,
      "total_time" : 0.05,
      "avg_time" : 0.05
    }
  ]
MAP/REDUCE
MongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documento
1   1   2

1   1   1

1   1   2

1   1   1

1   1

1   1
4

3

7

4
BANCO DE DADOS
db.items.insert({tags: ['dog', 'cat']})

db.items.insert({tags: ['dog']})

db.items.insert({tags: ['dog', 'mouse']})

db.items.insert({tags: ['dog', 'mouse', 'hippo']})

db.items.insert({tags: ['dog', 'mouse', 'hippo']})

db.items.insert({tags: ['dog', 'hippo']})
MAP

var map = function() {

    this.tags.forEach(function(t) {

         emit(t, {count: 1})

    })

}
REDUCE
var reduce = function(key, val) {

    var count = 0;

    for(var i = 0, len = val.length; i < len; i++) {

        count += val[i].count

    }

    return { count: count };

}
EXECUTANDO



var result = db.items.mapReduce(map, reduce);
RESULTADO
{
	   "result" : "tmp.mr.mapreduce_1286209644_2",
	   "timeMillis" : 30,
	   "counts" : {
	   	    "input" : 6,
	   	    "emit" : 13,
	   	    "output" : 4
	   },
	   "ok" : 1,
}
RESULTADO (MESMO!)



db["tmp.mr.mapreduce_1286209644_2"].find()

db[result['result']].find()
MAP/REDUCE


{ "_id" : "cat", "value" : { "count" : 1 } }

{ "_id" : "dog", "value" : { "count" : 6 } }

{ "_id" : "hippo", "value" : { "count" : 3 } }

{ "_id" : "mouse", "value" : { "count" : 3 } }
OPERAÇÕES ATÔMICAS
OPERAÇÕES ATÔMICAS

• Incrementando com $inc
  db.artigos.update(
     { _id : new ObjectId("4c041...")},
     { $inc: {"hits": 1} }
  )

• Atualizando:
  db.posts.update({}, { $set : { "hits" : 0 }})
ÍNDICES
ÍNDICES

• Desempenho      lento para escrita, mas muito mais rápida para
 leitura

• Para   melhores resultados, crie índices por onde você busca

• MongoDB     mantém índices em memória
SEM ÍNDICE
db.items.find({tags: "dog"}).explain();
{
	    "cursor" : "BasicCursor",
	    "nscanned" : 6,
	    "nscannedObjects" : 6,

	    "n" : 6,
	    "millis" : 10,
	    "indexBounds" : {
	    	

	    }
}
APLICANDO O ÍNDICE



db.items.ensureIndex({tags: 1})
COM ÍNDICE
db.items.find({tags: "dog"}).explain();
{

	     "cursor" : "BtreeCursor tags_1",
	     "nscanned" : 6,
	     "nscannedObjects" : 6,

	     "n" : 6,
	     "millis" : 0,

	     "indexBounds" : {
	     	    "tags" : [
	     	    	     [

	     	    	     	    "dog",
	     	    	     	    "dog"

	     	    	     ]
	     	    ]
	     }

}
GEOPOSICIONAMENTO
GEOPOSICIONAMENTO


• Geoposicionamento, com   MongoDB, é estupidamente
 simples

• Apenas adicione um índice:
  db.lugares.ensureIndex({ localizacao: "2d" })
LUGARES MAIS PERTO


 db.lugares.find({

      localizacao: { $near : [

           21.123456789, -20.123456789

      ]}

 })
20 LUGARES MAIS PERTO


  db.lugares.find({

    localizacao: { $near : [

         21.123456789, -20.123456789

    ]}

  }).limit(20)
EM UMA ÁREA
EM UMA ÁREA
db.lugares.find({

     localizacao: { $within: { $box: {

       [

           [21.123456789, -20.123456789],

           [22.123456789, -21.123456789]

       ]

     }}}

})
POR ONDE CONTINUAR?
WWW.MONGODB.ORG
MONGODB
THE DEFINITIVE GUIDE
REFERÊNCIAS
REFERÊNCIAS
OBRIGADO!


            Júlio Monteiro
        julio@monteiro.eti.br
1 of 61

Recommended

Nosql e BD Orientados a Documentos by
Nosql e BD Orientados a DocumentosNosql e BD Orientados a Documentos
Nosql e BD Orientados a DocumentosYuri Adams
2.2K views126 slides
MongoDB - Tudo o que você precisa saber by
MongoDB - Tudo o que você precisa saberMongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saberChristiano Anderson
12.5K views47 slides
Modelando aplicação em documento - MongoDB by
Modelando aplicação em documento - MongoDBModelando aplicação em documento - MongoDB
Modelando aplicação em documento - MongoDBThiago Avelino
8.1K views42 slides
MongoDB - Iniciando e Conhecendo by
MongoDB - Iniciando e ConhecendoMongoDB - Iniciando e Conhecendo
MongoDB - Iniciando e ConhecendoEdemilson Gonçalves
1.9K views28 slides
Desenvolvimento de aplicações PHP com MongoDB by
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBAri Stopassola Junior
4.8K views79 slides
Curso mongo db com php by
Curso mongo db com phpCurso mongo db com php
Curso mongo db com phpSuissa
4.9K views61 slides

More Related Content

What's hot

Mini-Curso de MongoDB by
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDBBrunno Gomes
824 views88 slides
Minicurso Epoca mongoDB by
Minicurso Epoca mongoDBMinicurso Epoca mongoDB
Minicurso Epoca mongoDBLelyBarros
1.5K views48 slides
#1 Introdução ao MongoDB by
#1   Introdução ao MongoDB#1   Introdução ao MongoDB
#1 Introdução ao MongoDBGabriel Alves Scavassa
1.8K views44 slides
Introdução ao MongoDB by
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDBElaine Naomi
390 views107 slides
NoSQL e MongoDB - ETEC by
NoSQL e MongoDB - ETECNoSQL e MongoDB - ETEC
NoSQL e MongoDB - ETECJefferson Queiroz
740 views83 slides
Mongo DB by
Mongo DBMongo DB
Mongo DBdist_bp
669 views22 slides

What's hot(20)

Mini-Curso de MongoDB by Brunno Gomes
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDB
Brunno Gomes824 views
Minicurso Epoca mongoDB by LelyBarros
Minicurso Epoca mongoDBMinicurso Epoca mongoDB
Minicurso Epoca mongoDB
LelyBarros1.5K views
Introdução ao MongoDB by Elaine Naomi
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDB
Elaine Naomi390 views
Mongo DB by dist_bp
Mongo DBMongo DB
Mongo DB
dist_bp669 views
MongoDB - Apresentação by Terra / Neo
MongoDB - ApresentaçãoMongoDB - Apresentação
MongoDB - Apresentação
Terra / Neo1.1K views
Elasticsearch: Motor de busca e além. Lições aprendidas criando Tu Próximo... by Miguel Gallardo
Elasticsearch: Motor de busca e além. Lições aprendidas criando Tu Próximo...Elasticsearch: Motor de busca e além. Lições aprendidas criando Tu Próximo...
Elasticsearch: Motor de busca e além. Lições aprendidas criando Tu Próximo...
Miguel Gallardo1.4K views
BigData - ElasticSearch + PHP by Felipe Weckx
BigData - ElasticSearch + PHPBigData - ElasticSearch + PHP
BigData - ElasticSearch + PHP
Felipe Weckx1.4K views
Desenvolvendo soluções com banco de dados não relacional - MongoDB by iMasters
Desenvolvendo soluções com banco de dados não relacional - MongoDBDesenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDB
iMasters2.5K views
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ... by Big Data Week São Paulo
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...

Viewers also liked

No sql Orientado a documento by
No sql Orientado a documentoNo sql Orientado a documento
No sql Orientado a documentoAlex Martins
6.5K views52 slides
Sistemas NoSQL, surgimento, características e exemplos by
Sistemas NoSQL, surgimento, características e exemplosSistemas NoSQL, surgimento, características e exemplos
Sistemas NoSQL, surgimento, características e exemplosAricelio Souza
15.7K views15 slides
MongoDB e Bancos de Dados Orientados a Documentos by
MongoDB e Bancos de Dados Orientados a DocumentosMongoDB e Bancos de Dados Orientados a Documentos
MongoDB e Bancos de Dados Orientados a DocumentosUNIFESP - Universidade Federal de São Paulo
1.2K views20 slides
Nova Infraestrutura JSON: System.JSON na prática by
Nova Infraestrutura JSON: System.JSON na prática Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Mario Guedes
10.1K views25 slides
Introduction to column oriented databases by
Introduction to column oriented databasesIntroduction to column oriented databases
Introduction to column oriented databasesArangoDB Database
38.1K views34 slides
Banco de Dados Não Relacionais vs Banco de Dados Relacionais by
Banco de Dados Não Relacionais vs Banco de Dados RelacionaisBanco de Dados Não Relacionais vs Banco de Dados Relacionais
Banco de Dados Não Relacionais vs Banco de Dados Relacionaisalexculpado
20.7K views19 slides

Viewers also liked(7)

No sql Orientado a documento by Alex Martins
No sql Orientado a documentoNo sql Orientado a documento
No sql Orientado a documento
Alex Martins6.5K views
Sistemas NoSQL, surgimento, características e exemplos by Aricelio Souza
Sistemas NoSQL, surgimento, características e exemplosSistemas NoSQL, surgimento, características e exemplos
Sistemas NoSQL, surgimento, características e exemplos
Aricelio Souza15.7K views
Nova Infraestrutura JSON: System.JSON na prática by Mario Guedes
Nova Infraestrutura JSON: System.JSON na prática Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática
Mario Guedes10.1K views
Introduction to column oriented databases by ArangoDB Database
Introduction to column oriented databasesIntroduction to column oriented databases
Introduction to column oriented databases
ArangoDB Database38.1K views
Banco de Dados Não Relacionais vs Banco de Dados Relacionais by alexculpado
Banco de Dados Não Relacionais vs Banco de Dados RelacionaisBanco de Dados Não Relacionais vs Banco de Dados Relacionais
Banco de Dados Não Relacionais vs Banco de Dados Relacionais
alexculpado20.7K views
Introducao aos Bancos de Dados Não-relacionais by Mauricio De Diana
Introducao aos Bancos de Dados Não-relacionaisIntroducao aos Bancos de Dados Não-relacionais
Introducao aos Bancos de Dados Não-relacionais
Mauricio De Diana5.9K views

Similar to MongoDB: um banco de dados orientado a documento

MongoDB Schema Design - Latinoware 2014 by
MongoDB Schema Design - Latinoware 2014MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014Christiano Anderson
1.5K views43 slides
NoSQL e MongoDB by
NoSQL e MongoDBNoSQL e MongoDB
NoSQL e MongoDBJefferson Queiroz
2K views81 slides
MongoDB - Workshop Buscapé by
MongoDB - Workshop BuscapéMongoDB - Workshop Buscapé
MongoDB - Workshop BuscapéWagner Bonfiglio
467 views14 slides
MongoDB - Wagner Bonfiglio - Navegg by
MongoDB - Wagner Bonfiglio - NaveggMongoDB - Wagner Bonfiglio - Navegg
MongoDB - Wagner Bonfiglio - NaveggFelipe Guimarães
272 views14 slides
Python e MongoDB - Ensol by
Python e MongoDB - EnsolPython e MongoDB - Ensol
Python e MongoDB - EnsolChristiano Anderson
1K views77 slides
MongoDB + PHP by
MongoDB + PHPMongoDB + PHP
MongoDB + PHPAri Stopassola Junior
1.1K views91 slides

Similar to MongoDB: um banco de dados orientado a documento(20)

Mongo db slides by Terra / Neo
Mongo db slidesMongo db slides
Mongo db slides
Terra / Neo1.1K views
MongoDB - Tudo que você precisa saber - FGSL 2014 by Christiano Anderson
MongoDB - Tudo que você precisa saber - FGSL 2014MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014
Christiano Anderson1.5K views
MongoDB, Banco de Dados orientado a documento by Thiago Avelino
MongoDB, Banco de Dados orientado a documentoMongoDB, Banco de Dados orientado a documento
MongoDB, Banco de Dados orientado a documento
Thiago Avelino1.6K views
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL) by Dickson S. Guedes
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Dickson S. Guedes1.1K views
Indexando e Ordenando Data Sets by Rodolfo Mendes
Indexando e Ordenando Data SetsIndexando e Ordenando Data Sets
Indexando e Ordenando Data Sets
Rodolfo Mendes480 views

More from Julio Monteiro

Por que Ruby on Rails? by
Por que Ruby on Rails?Por que Ruby on Rails?
Por que Ruby on Rails?Julio Monteiro
1.6K views60 slides
Como criar e lançar um e-commerce em 42 minutos by
Como criar e lançar um e-commerce em 42 minutosComo criar e lançar um e-commerce em 42 minutos
Como criar e lançar um e-commerce em 42 minutosJulio Monteiro
2.3K views26 slides
MongoDB by
MongoDBMongoDB
MongoDBJulio Monteiro
2.5K views48 slides
Desenvolvimento Web com Rails by
Desenvolvimento Web com RailsDesenvolvimento Web com Rails
Desenvolvimento Web com RailsJulio Monteiro
911 views64 slides
Segurança & Ruby on Rails by
Segurança & Ruby on RailsSegurança & Ruby on Rails
Segurança & Ruby on RailsJulio Monteiro
1.5K views96 slides
Como colaborar com projetos opensource com o GitHub by
Como colaborar com projetos opensource com o GitHubComo colaborar com projetos opensource com o GitHub
Como colaborar com projetos opensource com o GitHubJulio Monteiro
2.6K views37 slides

More from Julio Monteiro(13)

Como criar e lançar um e-commerce em 42 minutos by Julio Monteiro
Como criar e lançar um e-commerce em 42 minutosComo criar e lançar um e-commerce em 42 minutos
Como criar e lançar um e-commerce em 42 minutos
Julio Monteiro2.3K views
Desenvolvimento Web com Rails by Julio Monteiro
Desenvolvimento Web com RailsDesenvolvimento Web com Rails
Desenvolvimento Web com Rails
Julio Monteiro911 views
Segurança & Ruby on Rails by Julio Monteiro
Segurança & Ruby on RailsSegurança & Ruby on Rails
Segurança & Ruby on Rails
Julio Monteiro1.5K views
Como colaborar com projetos opensource com o GitHub by Julio Monteiro
Como colaborar com projetos opensource com o GitHubComo colaborar com projetos opensource com o GitHub
Como colaborar com projetos opensource com o GitHub
Julio Monteiro2.6K views
Como criar e lançar um site em 42 minutos by Julio Monteiro
Como criar e lançar um site em 42 minutosComo criar e lançar um site em 42 minutos
Como criar e lançar um site em 42 minutos
Julio Monteiro1.9K views
Ruby, Rails e Diversão (Campus Party Brasil 2009) by Julio Monteiro
Ruby, Rails e Diversão (Campus Party Brasil 2009)Ruby, Rails e Diversão (Campus Party Brasil 2009)
Ruby, Rails e Diversão (Campus Party Brasil 2009)
Julio Monteiro780 views
Introdução ao Ruby on Rails (SOCIESC) by Julio Monteiro
Introdução ao Ruby on Rails (SOCIESC)Introdução ao Ruby on Rails (SOCIESC)
Introdução ao Ruby on Rails (SOCIESC)
Julio Monteiro893 views
Introdução ao Ruby on Rails (InstallFest 2006) by Julio Monteiro
Introdução ao Ruby on Rails (InstallFest 2006)Introdução ao Ruby on Rails (InstallFest 2006)
Introdução ao Ruby on Rails (InstallFest 2006)
Julio Monteiro1.1K views
Ruby on Rails e o Mercado by Julio Monteiro
Ruby on Rails e o MercadoRuby on Rails e o Mercado
Ruby on Rails e o Mercado
Julio Monteiro2.4K views

MongoDB: um banco de dados orientado a documento

  • 2. /ME Rails Developer, JobScore (http://www.jobscore.com)
  • 4. AGENDA 1. Objetivo 2. Histórico 3. Características 4. Relacional versus MongoDB 5. Consultas 6. Map/reduce 7. Operações atômicas 8. Índices 9. Geoposicionamento 10.Por onde continuar?
  • 5. OBJETIVO MongoDB busca aproveitar vantagens de armazenamentos de chave-valor (que, no geral, são rápidos e escaláveis) e banco de dados relacionais tradicionais (que, no geral, oferecem consultas ricas e várias funcionalidades). (Adaptado do site oficial do MongoDB)
  • 6. Quando Chuck Norris fala, todos ficam em silêncio. E morrem.
  • 7. HISTÓRICO • Produto da 10gen • Desenvolvimento iniciou em Outubro de 2007 • Primeira versão pública em Fevereiro de 2009 • Atualmente na versão 1.6 • Licenciado sob a GNU AGPL
  • 8. CARACTERÍSTICAS (1/2) • Armazenamento orientado a documentos • Índices • Consultas ricas (rich queries) • Atualizações in-place rápidas • Map/Reduce
  • 9. CARACTERÍSTICAS (2/2) • Replicação e Alta Disponibilidade • Auto-Sharding • GridFS • Suporte Comercial (da 10gen)
  • 10. RELACIONAL VERSUS MONGODB
  • 11. TABELA id nome sobrenome idade 1 Ana Silva 20 2 Maria Carvalho 22 3 João Chaves 21 4 Mário Schimitd 30 ... ... ... ...
  • 12. DOCUMENTO Id: 1 Id: 2 Nome: Ana Nome: Maria Sobrenome: Silva Sobrenome: Carvalho Idade: 20 Idade: 22 Id: 3 Id: 4 Nome: João Nome: Mário Sobrenome: Chaves Sobrenome: Schimitd Idade: 21 Idade: 30
  • 13. TERMINOLOGIA Relacional Tradicional MongoDB (MySQL, PostgreSQL, etc) Database Database (Banco de dados) (Banco de dados) Table Collection (Tabela) (Coleção) Row Document (Linha, registro) (Documento) Column Attribute (Coluna) (Atributo)
  • 14. MODELO ENTIDADE- RELACIONAMENTO MYSQL artigos comentarios artigos_palavras_chave palavras_chave
  • 15. MODELO ENTIDADE MONGODB comentarios artigos palavras_chave
  • 16. DOCUMENTO EM { MONGODB "_id" : ObjectID("4c03e856e258c2701930c091"), "titulo" : "Campus Party Brasil 2011 vêm aí", "atalho" : "campus-party-brasil-2011-vem-ai", "texto" : "A Campus Party Brasil 2011 está chegando, e com elas diversas atrações!", "publicado" : true, "criado_em" : "Mon Oct 4 2010 16:00:00 GMT-0300 (BRT)", "atualizado_em" : "Mon Oct 4 2010 16:00:00 GMT-0300 (BRT)", "comentarios" : [ { "autor" : "Julio", "email" : "julio@monteiro.eti.br", "conteudo" : "Gostei muito da Campus!", "criado_em" : "Mon Oct 4 2010 17:00:00 GMT-0300 (BRT)" } ], "palavras_chave" : [ "cpbr4", "campus", "party" ] }
  • 18. BJSON Bin ary JavaScript Object Notation
  • 22. COMO BUSCO... • ... por uma palavra inteira? db.artigos.find({"titulo" : "campus"}) • ... por parte de uma palavra? db.artigos.find({"titulo" : /campus/i}) • ... por uma palavra dentro de um array? db.artigos.find({"palavras_chave" : "campus"}) • ... por uma palavra dentro de um embutido? db.artigos.find({ "comentarios.email" : "julio@monteiro.eti.br" })
  • 23. COMO ATUALIZO... ... determinado atributo de um registro? db.artigos.update( { "comentarios.email" : "julio@monteiro.eti.br" }, { $set: { "comentarios.$.email" : "julio@awegen.com" } } )
  • 25. OPERADORES $gt $all $gte $size $lt $exists $lte $type $ne $elemMatch $in $not $nin $where $mod
  • 26. USANDO OPERADORES • Maior que ($gt): terceiraIdade = db.pessoas.find({ "age": { $gt: 75 } }) • Incluindo ($in): interessante = db.artigos.find({ "tags" : { $in : ["mongodb", "interessante"] } }) • Não incluindo ($nin): todo = db.tarefas.find({ "status" : { $nin : [ "em execucao", "terminado" ] } })
  • 27. FUNÇÕES ARBITRÁRIAS • Usando funções arbitrárias (com $where): db.artigos.find({ $where : function() { return this.acessos % 2 == 0 } }) • Usando agrupamento (com $group): db.artigos.group({ "key" : { "hits" : true }, "initial" : { "count": 0 }, "reduce" : function(obj, prev) { prev.count++; } })
  • 28. FUNÇÃO DE AGRUPAMENTO • Dado que possui documentos como... { domain: "www.mongodb.org", invoked_at: {d:"2009-11-03", t:"17:14:05"}, response_time: 0.05, http_action: "GET /display/DOCS/Aggregation" }
  • 29. FUNÇÃO DE AGRUPAMENTO • Agrupamento: db.test.group( { cond: {"invoked_at.d": {$gte: "2009-11", $lt: "2009-12"}} , key: {http_action: true} , initial: {count: 0, total_time:0} , reduce: function(doc, out){ out.count++; out.total_time+=doc.response_time } , finalize: function(out){ out.avg_time = out.total_time / out.count } } )
  • 30. FUNÇÃO DE AGRUPAMENTO • Retorno do agrupamento: [ { "http_action" : "GET /display/DOCS/ Aggregation", "count" : 1, "total_time" : 0.05, "avg_time" : 0.05 } ]
  • 34. 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1 1
  • 36. BANCO DE DADOS db.items.insert({tags: ['dog', 'cat']}) db.items.insert({tags: ['dog']}) db.items.insert({tags: ['dog', 'mouse']}) db.items.insert({tags: ['dog', 'mouse', 'hippo']}) db.items.insert({tags: ['dog', 'mouse', 'hippo']}) db.items.insert({tags: ['dog', 'hippo']})
  • 37. MAP var map = function() { this.tags.forEach(function(t) { emit(t, {count: 1}) }) }
  • 38. REDUCE var reduce = function(key, val) { var count = 0; for(var i = 0, len = val.length; i < len; i++) { count += val[i].count } return { count: count }; }
  • 39. EXECUTANDO var result = db.items.mapReduce(map, reduce);
  • 40. RESULTADO { "result" : "tmp.mr.mapreduce_1286209644_2", "timeMillis" : 30, "counts" : { "input" : 6, "emit" : 13, "output" : 4 }, "ok" : 1, }
  • 42. MAP/REDUCE { "_id" : "cat", "value" : { "count" : 1 } } { "_id" : "dog", "value" : { "count" : 6 } } { "_id" : "hippo", "value" : { "count" : 3 } } { "_id" : "mouse", "value" : { "count" : 3 } }
  • 44. OPERAÇÕES ATÔMICAS • Incrementando com $inc db.artigos.update( { _id : new ObjectId("4c041...")}, { $inc: {"hits": 1} } ) • Atualizando: db.posts.update({}, { $set : { "hits" : 0 }})
  • 46. ÍNDICES • Desempenho lento para escrita, mas muito mais rápida para leitura • Para melhores resultados, crie índices por onde você busca • MongoDB mantém índices em memória
  • 47. SEM ÍNDICE db.items.find({tags: "dog"}).explain(); { "cursor" : "BasicCursor", "nscanned" : 6, "nscannedObjects" : 6, "n" : 6, "millis" : 10, "indexBounds" : { } }
  • 49. COM ÍNDICE db.items.find({tags: "dog"}).explain(); { "cursor" : "BtreeCursor tags_1", "nscanned" : 6, "nscannedObjects" : 6, "n" : 6, "millis" : 0, "indexBounds" : { "tags" : [ [ "dog", "dog" ] ] } }
  • 51. GEOPOSICIONAMENTO • Geoposicionamento, com MongoDB, é estupidamente simples • Apenas adicione um índice: db.lugares.ensureIndex({ localizacao: "2d" })
  • 52. LUGARES MAIS PERTO db.lugares.find({ localizacao: { $near : [ 21.123456789, -20.123456789 ]} })
  • 53. 20 LUGARES MAIS PERTO db.lugares.find({ localizacao: { $near : [ 21.123456789, -20.123456789 ]} }).limit(20)
  • 55. EM UMA ÁREA db.lugares.find({ localizacao: { $within: { $box: { [ [21.123456789, -20.123456789], [22.123456789, -21.123456789] ] }}} })
  • 61. OBRIGADO! Júlio Monteiro julio@monteiro.eti.br