SlideShare ist ein Scribd-Unternehmen logo
1 von 61
Downloaden Sie, um offline zu lesen
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
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
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

Weitere ähnliche Inhalte

Was ist angesagt?

Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDBBrunno Gomes
 
Minicurso Epoca mongoDB
Minicurso Epoca mongoDBMinicurso Epoca mongoDB
Minicurso Epoca mongoDBLelyBarros
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDBElaine Naomi
 
Mongo DB
Mongo DBMongo DB
Mongo DBdist_bp
 
MongoDB - Apresentação
MongoDB - ApresentaçãoMongoDB - Apresentação
MongoDB - ApresentaçãoTerra / Neo
 
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...
Elasticsearch: Motor de busca e além. Lições aprendidas criando Tu Próximo...Miguel Gallardo
 
acm, chapter, development, events, iscte, portugal, opensource, softwareApres...
acm, chapter, development, events, iscte, portugal, opensource, softwareApres...acm, chapter, development, events, iscte, portugal, opensource, softwareApres...
acm, chapter, development, events, iscte, portugal, opensource, softwareApres...ISCTE-IUL ACM Student Chapter
 
BigData - ElasticSearch + PHP
BigData - ElasticSearch + PHPBigData - ElasticSearch + PHP
BigData - ElasticSearch + PHPFelipe Weckx
 
Novidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPNovidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPLuiz Henrique Zambom Santana
 
Desenvolvendo soluções com banco de dados não relacional - MongoDB
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 - MongoDBiMasters
 
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 ...
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...Big Data Week São Paulo
 
MongoDB Introdução
MongoDB IntroduçãoMongoDB Introdução
MongoDB IntroduçãoThiago Poiani
 

Was ist angesagt? (20)

Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDB
 
Minicurso Epoca mongoDB
Minicurso Epoca mongoDBMinicurso Epoca mongoDB
Minicurso Epoca mongoDB
 
#1 Introdução ao MongoDB
#1   Introdução ao MongoDB#1   Introdução ao MongoDB
#1 Introdução ao MongoDB
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDB
 
NoSQL e MongoDB - ETEC
NoSQL e MongoDB - ETECNoSQL e MongoDB - ETEC
NoSQL e MongoDB - ETEC
 
Mongo DB
Mongo DBMongo DB
Mongo DB
 
MongoDB - Apresentação
MongoDB - ApresentaçãoMongoDB - Apresentação
MongoDB - Apresentação
 
Mongo + php
Mongo + phpMongo + php
Mongo + php
 
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...
Elasticsearch: Motor de busca e além. Lições aprendidas criando Tu Próximo...
 
Treinamento Elasticsearch - Parte 2
Treinamento Elasticsearch - Parte 2Treinamento Elasticsearch - Parte 2
Treinamento Elasticsearch - Parte 2
 
acm, chapter, development, events, iscte, portugal, opensource, softwareApres...
acm, chapter, development, events, iscte, portugal, opensource, softwareApres...acm, chapter, development, events, iscte, portugal, opensource, softwareApres...
acm, chapter, development, events, iscte, portugal, opensource, softwareApres...
 
BigData - ElasticSearch + PHP
BigData - ElasticSearch + PHPBigData - ElasticSearch + PHP
BigData - ElasticSearch + PHP
 
Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1
 
Primeiros Passos Com Elasticsearch
Primeiros Passos Com ElasticsearchPrimeiros Passos Com Elasticsearch
Primeiros Passos Com Elasticsearch
 
Palestra MongoDB
Palestra MongoDBPalestra MongoDB
Palestra MongoDB
 
Novidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPNovidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHP
 
Desenvolvendo soluções com banco de dados não relacional - MongoDB
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
 
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 ...
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
 
#3 Instalação MongoDB
#3   Instalação MongoDB  #3   Instalação MongoDB
#3 Instalação MongoDB
 
MongoDB Introdução
MongoDB IntroduçãoMongoDB Introdução
MongoDB Introdução
 

Andere mochten auch

No sql Orientado a documento
No sql Orientado a documentoNo sql Orientado a documento
No sql Orientado a documentoAlex Martins
 
Sistemas NoSQL, surgimento, características e exemplos
Sistemas NoSQL, surgimento, características e exemplosSistemas NoSQL, surgimento, características e exemplos
Sistemas NoSQL, surgimento, características e exemplosAricelio Souza
 
Nova Infraestrutura JSON: System.JSON na prática
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
 
Introduction to column oriented databases
Introduction to column oriented databasesIntroduction to column oriented databases
Introduction to column oriented databasesArangoDB Database
 
Banco de Dados Não Relacionais vs Banco de Dados Relacionais
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
 
Introducao aos Bancos de Dados Não-relacionais
Introducao aos Bancos de Dados Não-relacionaisIntroducao aos Bancos de Dados Não-relacionais
Introducao aos Bancos de Dados Não-relacionaisMauricio De Diana
 

Andere mochten auch (7)

No sql Orientado a documento
No sql Orientado a documentoNo sql Orientado a documento
No sql Orientado a documento
 
Sistemas NoSQL, surgimento, características e exemplos
Sistemas NoSQL, surgimento, características e exemplosSistemas NoSQL, surgimento, características e exemplos
Sistemas NoSQL, surgimento, características e exemplos
 
MongoDB e Bancos de Dados Orientados a Documentos
MongoDB e Bancos de Dados Orientados a DocumentosMongoDB e Bancos de Dados Orientados a Documentos
MongoDB e Bancos de Dados Orientados a Documentos
 
Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática
 
Introduction to column oriented databases
Introduction to column oriented databasesIntroduction to column oriented databases
Introduction to column oriented databases
 
Banco de Dados Não Relacionais vs Banco de Dados Relacionais
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
 
Introducao aos Bancos de Dados Não-relacionais
Introducao aos Bancos de Dados Não-relacionaisIntroducao aos Bancos de Dados Não-relacionais
Introducao aos Bancos de Dados Não-relacionais
 

Ähnlich wie MongoDB: um banco de dados orientado a documento

MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014Christiano Anderson
 
MongoDB - Wagner Bonfiglio - Navegg
MongoDB - Wagner Bonfiglio - NaveggMongoDB - Wagner Bonfiglio - Navegg
MongoDB - Wagner Bonfiglio - NaveggFelipe Guimarães
 
MongoDB - Workshop Buscapé
MongoDB - Workshop BuscapéMongoDB - Workshop Buscapé
MongoDB - Workshop BuscapéWagner Bonfiglio
 
Introdução ao MongoDB em 30 slides
Introdução ao MongoDB em 30 slidesIntrodução ao MongoDB em 30 slides
Introdução ao MongoDB em 30 slidesDerek Willian Stavis
 
Desenvolvendo com mongodb
Desenvolvendo com mongodbDesenvolvendo com mongodb
Desenvolvendo com mongodbThiago Avelino
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Christiano Anderson
 
MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014Christiano Anderson
 
Introdução ao nosql (mini curso)
Introdução ao nosql (mini curso)Introdução ao nosql (mini curso)
Introdução ao nosql (mini curso)Junior Fernandes
 
MongoDB, Banco de Dados orientado a documento
MongoDB, Banco de Dados orientado a documentoMongoDB, Banco de Dados orientado a documento
MongoDB, Banco de Dados orientado a documentoThiago Avelino
 
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)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)Dickson S. Guedes
 
Indexando e Ordenando Data Sets
Indexando e Ordenando Data SetsIndexando e Ordenando Data Sets
Indexando e Ordenando Data SetsRodolfo Mendes
 

Ähnlich wie MongoDB: um banco de dados orientado a documento (20)

MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014
 
NoSQL e MongoDB
NoSQL e MongoDBNoSQL e MongoDB
NoSQL e MongoDB
 
MongoDB - Wagner Bonfiglio - Navegg
MongoDB - Wagner Bonfiglio - NaveggMongoDB - Wagner Bonfiglio - Navegg
MongoDB - Wagner Bonfiglio - Navegg
 
MongoDB - Workshop Buscapé
MongoDB - Workshop BuscapéMongoDB - Workshop Buscapé
MongoDB - Workshop Buscapé
 
Python e MongoDB - Ensol
Python e MongoDB - EnsolPython e MongoDB - Ensol
Python e MongoDB - Ensol
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Introdução ao MongoDB em 30 slides
Introdução ao MongoDB em 30 slidesIntrodução ao MongoDB em 30 slides
Introdução ao MongoDB em 30 slides
 
Desenvolvendo com mongodb
Desenvolvendo com mongodbDesenvolvendo com mongodb
Desenvolvendo com mongodb
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7
 
Minicurso mongo db
Minicurso mongo dbMinicurso mongo db
Minicurso mongo db
 
Mongo db slides
Mongo db slidesMongo db slides
Mongo db slides
 
Mongodb workshop cinlug
Mongodb workshop cinlugMongodb workshop cinlug
Mongodb workshop cinlug
 
MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014
 
Introdução ao nosql (mini curso)
Introdução ao nosql (mini curso)Introdução ao nosql (mini curso)
Introdução ao nosql (mini curso)
 
MongoDB na Campus Party
MongoDB na Campus PartyMongoDB na Campus Party
MongoDB na Campus Party
 
MongoDB, Banco de Dados orientado a documento
MongoDB, Banco de Dados orientado a documentoMongoDB, Banco de Dados orientado a documento
MongoDB, Banco de Dados orientado a documento
 
Workshop MongoDB
Workshop MongoDBWorkshop MongoDB
Workshop MongoDB
 
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)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
 
Mongopesl
MongopeslMongopesl
Mongopesl
 
Indexando e Ordenando Data Sets
Indexando e Ordenando Data SetsIndexando e Ordenando Data Sets
Indexando e Ordenando Data Sets
 

Mehr von Julio Monteiro

Por que Ruby on Rails?
Por que Ruby on Rails?Por que Ruby on Rails?
Por que Ruby on Rails?Julio Monteiro
 
Como criar e lançar um e-commerce em 42 minutos
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
 
Desenvolvimento Web com Rails
Desenvolvimento Web com RailsDesenvolvimento Web com Rails
Desenvolvimento Web com RailsJulio Monteiro
 
Segurança & Ruby on Rails
Segurança & Ruby on RailsSegurança & Ruby on Rails
Segurança & Ruby on RailsJulio Monteiro
 
Como colaborar com projetos opensource com o GitHub
Como colaborar com projetos opensource com o GitHubComo colaborar com projetos opensource com o GitHub
Como colaborar com projetos opensource com o GitHubJulio Monteiro
 
Como criar e lançar um site em 42 minutos
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 minutosJulio Monteiro
 
Ubuntu Enterprise Cloud
Ubuntu Enterprise CloudUbuntu Enterprise Cloud
Ubuntu Enterprise CloudJulio 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)
Ruby, Rails e Diversão (Campus Party Brasil 2009)Julio Monteiro
 
Introdução ao Ruby on Rails (SOCIESC)
Introdução ao Ruby on Rails (SOCIESC)Introdução ao Ruby on Rails (SOCIESC)
Introdução ao Ruby on Rails (SOCIESC)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)
Introdução ao Ruby on Rails (InstallFest 2006)Julio Monteiro
 
Ruby on Rails e o Mercado
Ruby on Rails e o MercadoRuby on Rails e o Mercado
Ruby on Rails e o MercadoJulio Monteiro
 
Ruby, Rails e Diversão
Ruby, Rails e DiversãoRuby, Rails e Diversão
Ruby, Rails e DiversãoJulio Monteiro
 

Mehr von Julio Monteiro (13)

Por que Ruby on Rails?
Por que Ruby on Rails?Por que Ruby on Rails?
Por que Ruby on Rails?
 
Como criar e lançar um e-commerce em 42 minutos
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
 
MongoDB
MongoDBMongoDB
MongoDB
 
Desenvolvimento Web com Rails
Desenvolvimento Web com RailsDesenvolvimento Web com Rails
Desenvolvimento Web com Rails
 
Segurança & Ruby on Rails
Segurança & Ruby on RailsSegurança & Ruby on Rails
Segurança & Ruby on Rails
 
Como colaborar com projetos opensource com o GitHub
Como colaborar com projetos opensource com o GitHubComo colaborar com projetos opensource com o GitHub
Como colaborar com projetos opensource com o GitHub
 
Como criar e lançar um site em 42 minutos
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
 
Ubuntu Enterprise Cloud
Ubuntu Enterprise CloudUbuntu Enterprise Cloud
Ubuntu Enterprise Cloud
 
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)
Ruby, Rails e Diversão (Campus Party Brasil 2009)
 
Introdução ao Ruby on Rails (SOCIESC)
Introdução ao Ruby on Rails (SOCIESC)Introdução ao Ruby on Rails (SOCIESC)
Introdução ao Ruby on Rails (SOCIESC)
 
Introdução ao Ruby on Rails (InstallFest 2006)
Introdução ao Ruby on Rails (InstallFest 2006)Introdução ao Ruby on Rails (InstallFest 2006)
Introdução ao Ruby on Rails (InstallFest 2006)
 
Ruby on Rails e o Mercado
Ruby on Rails e o MercadoRuby on Rails e o Mercado
Ruby on Rails e o Mercado
 
Ruby, Rails e Diversão
Ruby, Rails e DiversãoRuby, Rails e Diversão
Ruby, Rails e Diversão
 

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
  • 19.
  • 20.
  • 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 } ]
  • 32.
  • 33.
  • 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