SlideShare uma empresa Scribd logo
1 de 34
Apresentando

Neo@Corp.Terra.com.br
Rodrigo Nossal @nossal
Rudá Moura @__ruda__
MongoDB não siginifica o que
  vocês estão pensando!
    Momento politicamente correto
3
MongoDB vem de humongous

    humongous = grande, enorme
NoSQL? É Só Hype Ou É pra Valer?

• NoSQL (Not Only SQL) é o termo genérico de BD que não
  segue o modelo relacional de dados;
• A idéia não é nova, o CDS/ISIS de 1985 já era utilizado para
  guardar documentos em biblioteca de forma não relacional e
  não normalizada;
• Ganhou notoriedade no meio dos anos 00 para soluções que
  “web scales” e com o BigTable do Google;
• O objetivo é armazenar informação na forma de elementos
  chave/valor, não-normalizado e não relacional;
• Hype? Pode ser, mas "está ai no mercado" e muitos produtos
  estão sendo feitos com essa tecnologia;
• MongoDB não é o único NoSQL de sucesso: CouchDB,
  Cassandra, BigTable, Riak, MemBase, Redis, Hbase.
Terminologia


   SQL (RDBMS)   MongoDB
   • Database    • Database
   • Table       • Collection
   • Row(s)      • (JSON) Documents
   • Query       • Query
   • Index       • Index
   • Partition   • Shard
Principais Características

• Banco de dados orientados à documentos;
• Escalável e de alto-desempenho;
• Código aberto - desenvolvido e mantido pela 10gen;
• Utiliza documentos JSON para o modelo de dados;
• Consultas são baseadas em documentos;
• Sharding = particionamento em múltiplos servidores;
• Suporta internamente MapReduce;
• Suporta operações atômicas em documentos simples;
• Desenvolvido em C++;
• Possui drivers para várias linguagens: Python, Java, PHP,
  Erlang, etc.;
• Última versão estável: 1.8.1 (06 de Abril de 2011).
Por Que JSON?

• JSON (JavaScript Object Notation) é um formato leve de
  troca de dados, é um subconjunto pequeno de Javascript;
• É independente de linguagem de programção, composto por
  pares de chave e valor;
• As consultas são feitas por JSON e o retorno é sempre um
  documento JSON, ou uma lista de documentos JSON;
• JSON é muito utilizado para o intercâmbio de informações na
  web (adios XML!);
• A linguagem de comandos e funções internas do MongoDB é
  JavaScript.
Documento JSON

{ "_id" : ObjectId("4d3f3574c405441a31000000"),
  "config" : { "max_range" : 10,
               "min_range" : 0,
               "type" : "range" },
  "name" : "Linguagens",
  "description" : "Ranking de
   linguagens de programação"
}
Armazenamento

• Os documentos JSON são internamente guardados como
  BJSON (formato binário) (< 16MB);
• A espeficação GridFS permite guardar documentos grandes
  (> 16MB) de forma transparente;
• O MongoDB usa um mecanismo de armazenamento em
  memória mapeada (Memory Mapped Storage Engine);
• O gerenciador de memória virtual do S.O. fica responsável
  pelo cache de dados do MongoDB.
Índices

• Todo documento de uma collection contém uma chave padrão
  "_id" indexada;
• O valor da chave “_id”: ObjectId("4d3727c33612f747d7000000");
• Qualquer chave do documento pode ser indexada
  (exceto em capped collections).


 > db.votes.ensureIndex({'obj.name': 1})
Segurança

• Recomenda-se o uso do MongoDB em ambientes confiáveis
  (rede privada e firewall);
• Pode-se configurar autenticação por usuário e senha;
• Para adicionar um usuário à uma database:
  > db.addUser("theadmin", "anadminpassword", true)
• Para autenticar:
  > db.auth("theadmin", "anadminpassword")
MapReduce

•   MongoDB suporta MapReduce;
•   A operação Map pode servir para modificar ou filtrar valores;
•   A operação Reduce para consolidar um conjunto de valores;
•   As operações de Map e Reduce são executadas de maneira
    distribuídas entre os shards do cluster.
                         Map
                         f(x) = {x*2}
             [1, 2, 3]                  [2, 4, 6]

                                                    Reduce
                                                    f(x, y) = {x+y}

                                        [12]
Durabilidade

• Operações que alteram os documentos são realizadas de
  maneira direta no BD, portanto não existem transações;
• Não existem logs de transação, que garantam a durabilidade
  dos dados como fazem os RDBMS;
• A durabilidade deve ser garantida pela replicação dos dados
  em diferentes servidores;
• Desde a versão 1.7.5 é possível contar com um journaling de
  dados, o que deixa o banco mais robusto.
GridFS

• Armazenamento de arquivos;
• Divide os arquivos em chunks de 256kb;
• Armazena os metadados na collection fs.files, e as partes
  do arquivo na collection fs.chunks;
• O MongoDB faz streaming do arquivo para a aplicação;
• Facilidade para fazer seek em arquivos.
Capped Collections

• Collections com tamanho fixo;
• Funciona como uma fila FIFO: primeiro a entrar, primeiro a
  sair;

> db.createCollection("last_comments", {capped:true, size:
100000})
> db.last_votes.validate()

OBS.: size em bytes
Tailable Cursors

• Igual a um “tail -f” do Unix, numa Capped collection.

 >>> finder = db.last_comments.find(tailable=True)
 >>> while True:
 >>> time.sleep(1)
 >>> for doc in finder:
 >>>      print doc
Sharding

• Particionamento horizontal;
• Database sharding: Distribui as collections entre os shards;
• Collection sharding: Distribui os documentos de mesma
  chave entre os Shards;

Collection cep:
 {uf: 'RS',
  local:'Posto Alegre',
  logr:'Rua General Câmara',
  cep: '90010-230'}

>db.runCommand({ shardcollection : "cep", key : "uf" })
Sharding
Limitações

• Sistemas de 32 bits existe a limitação de 2GB no tamanho do
  BD (limite de memória por processo, 64 bits é maior);
• 4mb por documento JSON, mas pode ser extendido com uso
  de GridFS;
• O número máximo de conexões que o MongoDB aceita,
  depende do limite de arquivos abertos do sistema operacional
  (ulimit -n);
• Não é muito performático quando se necessita fazer "joins"
  entre documentos;
• Não existe um esquema de locking tradicional e transações
  complexas.
Instalação

CentOS5
• http://www.mongodb.org/display/DOCS/CentOS+and+Fedora
  +Packages
• Adicionar os repositórios da 10gen para o MongoDB
  o Estão no link acima
• Com a ajuda do yum:
  $ yum install mongo-stable mongo-stable-server
Teste da instalação

$ grep dbpath /etc/mongod.conf
dbpath=/var/lib/mongo

$ sudo /etc/init.d/mongod start
$ sudo /etc/init.d/mongod status
mongod (pid 4745) is running...

$ mongo
MongoDB shell version: 1.6.5
connecting to: test
> show dbs
admin
local
test
Utilizando o MongoDB

> use tiobe;
switched to db tiobe

> var py = { language: "Python", position: 1, delta: +3 };
> printjson(py);
{ "language" : "Python", "position" : 1, "delta" : 3 }

> db.tiobe.save(py);

> db.tiobe.find();
{ "_id" : ObjectId("4d63c372bbd24861417f9a19"), "language" :
"Python", "position" : 1, "delta" : 3 }
Utilizando o MongoDB

> db.tiobe.save({language: "C++", position: 3, delta: 1});
> db.tiobe.save({language: "C", position: 2, delta: 0});
> db.tiobe.save({language: "Java", position: 1, delta: 0});

> db.tiobe.find();
{ "_id" : ObjectId("4d63c372bbd24861417f9a19"), "language" :
"Python", "position" : 1, "delta" : 3 }
{ "_id" : ObjectId("4d63c3d1bbd24861417f9a1a"), "language" :
"C++", "position" : 3, "delta" : 1 }
{ "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"), "language" :
"C", "position" : 2, "delta" : 0 }
{ "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"), "language" :
"Java", "position" : 1, "delta" : 0 }
Utilizando o MongoDB

> db.tiobe.find()[0];
{
     "_id" : ObjectId("4d63c372bbd24861417f9a19"),
     "language" : "Python",
     "position" : 1,
     "delta" : 3
}

> var cursor = db.tiobe.find();
> printjson(cursor[3]);
{    "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"),
     "language" : "Java",
     "position" : 1,
     "delta" : 0 }
Utilizando o MongoDB

> var cursor = db.tiobe.find().limit(2);
> cursor.forEach(printjson);
{    "_id" : ObjectId("4d63c3d1bbd24861417f9a1a"),
     "delta" : 1,
     "language" : "C++",
     "position" : 3,
     "year" : 2011 }
{    "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"),
     "delta" : 0,
     "language" : "C",
     "position" : 2,
     "year" : 2011 }
Utilizando o MongoDB

> db.tiobe.update({language: "Python"}, {position: 4});

> db.tiobe.find({delta:0});
{ "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"), "language" :
"C", "position" : 2, "delta" : 0 }
{ "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"), "language" :
"Java", "position" : 1, "delta" : 0 }

> db.tiobe.find({delta:0}, {language:true});
{ "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"), "language" :
"C" }
{ "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"), "language" :
"Java" }
Utilizando o MongoDB

> db.tiobe.find({position: {$lt: 4}});
{ "_id" : ObjectId("4d63c3d1bbd24861417f9a1a"), "language" :
"C++", "position" : 3, "delta" : 1 }
{ "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"), "language" :
"C", "position" : 2, "delta" : 0 }
{ "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"), "language" :
"Java", "position" : 1, "delta" : 0 }

> db.tiobe.update({}, {$set: {year: 2011}}, false, true);
{ ... }

> db.tiobe.remove({_id: ObjectId
('4d63c372bbd24861417f9a19')});
> db.tiobe.remove({}); TUDO!
MongoDB Drivers


• Drivers são extensões para uso emlinguagens de
  programação;
• Suporte as linguagens de programação:
  o C/C++
  o Python
  o Javascript
  o PHP
  o + Erlang, Java, Perl, Scala

• Python: PyMongo.
PyMongo

 • É o driver recomendado para uso do MongoDB com Python;
 • Instalação:
   o sudo pip install pymongo

 • Uso:
>>> import pymongo
>>> conn = pymongo.Conection() # localhost
>>> db = conn.tiobe
>>> print db.tiobe.find_one({'language': 'C++'})
{u'position': 3.0, u'_id': ObjectId('4d63c3d1bbd24861417f9a1a'),
u'year': 2011.0, u'language': u'C++', u'delta': 1.0}
>>> cursor = db.tiobe.find()
>>> for elem in cursor: print elem
• {u'_id': ObjectId('4d63c372bbd24861417f9a19'), u'year': 2011.0}
• {u'position': 3.0, u'_id': ObjectId('4d63c3d1bbd24861417f9a1a'), u'year': 2011.0,
  u'language': u'C++', u'delta': 1.0}
• {u'position': 2.0, u'_id': ObjectId('4d63c3e2bbd24861417f9a1b'), u'year': 2011.0,
  u'language': u'C', u'delta': 0.0}
• {u'position': 1.0, u'_id': ObjectId('4d63c3fbbbd24861417f9a1c'), u'year': 2011.0,
  u'language': u'Java', u'delta': 0.0}
• {u'position': 5.0, u'_id': ObjectId('4d63cba91d00876348d47b1e'), u'year': 2011.0,
  u'language': u'PHP', u'delta': -2.0}
>>> cursor = db.tiobe.find({'delta': 0})
>>> print cursor.count()
2


Em resumo, total suporte do MongoDB com Python!
Persistência de Objetos

• ORM ou Object-Relational Mapping (Mapeamento Objeto-
  relacional) é o mecanismo para mapear modelos de objetos/
  classes em armazenamento de banco;
• É a maneira de construir persistência de objetos em termos
  de armazenamento em banco de dados;
• Podemos usar o MongoDB para mapear objetos de
  linguagem de programação em BD;
• Naturalmente não faz muito sentido chamar de ORM, porque
  bem... MongoDB não é relacional!
MongoEngine

• Mapeamento de objetos no modelo de documentos do
  MongoDB;
• Muito parecido com a modelagem de objetos do Django.
• Requer pymongo;
• Instalação:
     $ sudo pip install mongoengine
• Uso:
   o Ver a apresentação do demo "microblog".
Referências

• http://www.mongodb.org/
• http://api.mongodb.org/python/
• http://mongoengine.org/

Mais conteúdo relacionado

Mais procurados

Redis persistence in practice
Redis persistence in practiceRedis persistence in practice
Redis persistence in practiceEugene Fidelin
 
Fundamentos de banco de dados 01 indrodução
Fundamentos de banco de dados   01 indroduçãoFundamentos de banco de dados   01 indrodução
Fundamentos de banco de dados 01 indroduçãoRafael Pinheiro
 
Plano Geral de Governança de Dados
Plano Geral de Governança de DadosPlano Geral de Governança de Dados
Plano Geral de Governança de DadosGustavo Alexandre
 
HBase Tutorial For Beginners | HBase Architecture | HBase Tutorial | Hadoop T...
HBase Tutorial For Beginners | HBase Architecture | HBase Tutorial | Hadoop T...HBase Tutorial For Beginners | HBase Architecture | HBase Tutorial | Hadoop T...
HBase Tutorial For Beginners | HBase Architecture | HBase Tutorial | Hadoop T...Simplilearn
 
Banco de dados orientados a objetos
Banco de dados orientados a objetos Banco de dados orientados a objetos
Banco de dados orientados a objetos Raquel Machado
 
Introdução a Banco de Dados (Parte 1)
Introdução a Banco de Dados (Parte 1)Introdução a Banco de Dados (Parte 1)
Introdução a Banco de Dados (Parte 1)Mario Sergio
 
PostgreSQL and JDBC: striving for high performance
PostgreSQL and JDBC: striving for high performancePostgreSQL and JDBC: striving for high performance
PostgreSQL and JDBC: striving for high performanceVladimir Sitnikov
 
Design Patterns For Real Time Streaming Data Analytics
Design Patterns For Real Time Streaming Data AnalyticsDesign Patterns For Real Time Streaming Data Analytics
Design Patterns For Real Time Streaming Data AnalyticsDataWorks Summit
 
Cluster e replicação em banco de dados
Cluster e replicação em banco de dadosCluster e replicação em banco de dados
Cluster e replicação em banco de dadosSuissa
 
Banco de Dados II: MER (aula 1)
Banco de Dados II: MER (aula 1)Banco de Dados II: MER (aula 1)
Banco de Dados II: MER (aula 1)Gustavo Zimmermann
 
Automate MariaDB Galera clusters deployments with Ansible
Automate MariaDB Galera clusters deployments with AnsibleAutomate MariaDB Galera clusters deployments with Ansible
Automate MariaDB Galera clusters deployments with AnsibleFederico Razzoli
 
An Introduction to REDIS NoSQL database
An Introduction to REDIS NoSQL databaseAn Introduction to REDIS NoSQL database
An Introduction to REDIS NoSQL databaseAli MasudianPour
 
Introdução aos Serviços de Rede
Introdução aos Serviços de RedeIntrodução aos Serviços de Rede
Introdução aos Serviços de RedeNatanael Simões
 
1. introduction to no sql
1. introduction to no sql1. introduction to no sql
1. introduction to no sqlAnuja Gunale
 
Banco de dados orientado a objetos
Banco de dados orientado a objetosBanco de dados orientado a objetos
Banco de dados orientado a objetosStefan Horochovec
 
Utilização de Seletividade e Estimativa de Custo na Otimização de Consultas
Utilização de Seletividade e Estimativa de Custo na Otimização de ConsultasUtilização de Seletividade e Estimativa de Custo na Otimização de Consultas
Utilização de Seletividade e Estimativa de Custo na Otimização de ConsultasDenilson Sousa
 

Mais procurados (20)

Redis persistence in practice
Redis persistence in practiceRedis persistence in practice
Redis persistence in practice
 
Fundamentos de banco de dados 01 indrodução
Fundamentos de banco de dados   01 indroduçãoFundamentos de banco de dados   01 indrodução
Fundamentos de banco de dados 01 indrodução
 
Banco de Dados - Conceitos Básicos
Banco de Dados - Conceitos BásicosBanco de Dados - Conceitos Básicos
Banco de Dados - Conceitos Básicos
 
Plano Geral de Governança de Dados
Plano Geral de Governança de DadosPlano Geral de Governança de Dados
Plano Geral de Governança de Dados
 
Mongo db intro.pptx
Mongo db intro.pptxMongo db intro.pptx
Mongo db intro.pptx
 
HBase Tutorial For Beginners | HBase Architecture | HBase Tutorial | Hadoop T...
HBase Tutorial For Beginners | HBase Architecture | HBase Tutorial | Hadoop T...HBase Tutorial For Beginners | HBase Architecture | HBase Tutorial | Hadoop T...
HBase Tutorial For Beginners | HBase Architecture | HBase Tutorial | Hadoop T...
 
Banco de dados orientados a objetos
Banco de dados orientados a objetos Banco de dados orientados a objetos
Banco de dados orientados a objetos
 
Introdução a Banco de Dados (Parte 1)
Introdução a Banco de Dados (Parte 1)Introdução a Banco de Dados (Parte 1)
Introdução a Banco de Dados (Parte 1)
 
PostgreSQL and JDBC: striving for high performance
PostgreSQL and JDBC: striving for high performancePostgreSQL and JDBC: striving for high performance
PostgreSQL and JDBC: striving for high performance
 
Design Patterns For Real Time Streaming Data Analytics
Design Patterns For Real Time Streaming Data AnalyticsDesign Patterns For Real Time Streaming Data Analytics
Design Patterns For Real Time Streaming Data Analytics
 
Cluster e replicação em banco de dados
Cluster e replicação em banco de dadosCluster e replicação em banco de dados
Cluster e replicação em banco de dados
 
Hadoop
HadoopHadoop
Hadoop
 
Banco de Dados II: MER (aula 1)
Banco de Dados II: MER (aula 1)Banco de Dados II: MER (aula 1)
Banco de Dados II: MER (aula 1)
 
Automate MariaDB Galera clusters deployments with Ansible
Automate MariaDB Galera clusters deployments with AnsibleAutomate MariaDB Galera clusters deployments with Ansible
Automate MariaDB Galera clusters deployments with Ansible
 
An Introduction to REDIS NoSQL database
An Introduction to REDIS NoSQL databaseAn Introduction to REDIS NoSQL database
An Introduction to REDIS NoSQL database
 
Introdução aos Serviços de Rede
Introdução aos Serviços de RedeIntrodução aos Serviços de Rede
Introdução aos Serviços de Rede
 
Selecting best NoSQL
Selecting best NoSQL Selecting best NoSQL
Selecting best NoSQL
 
1. introduction to no sql
1. introduction to no sql1. introduction to no sql
1. introduction to no sql
 
Banco de dados orientado a objetos
Banco de dados orientado a objetosBanco de dados orientado a objetos
Banco de dados orientado a objetos
 
Utilização de Seletividade e Estimativa de Custo na Otimização de Consultas
Utilização de Seletividade e Estimativa de Custo na Otimização de ConsultasUtilização de Seletividade e Estimativa de Custo na Otimização de Consultas
Utilização de Seletividade e Estimativa de Custo na Otimização de Consultas
 

Semelhante a Mongo db slides

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
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBAri Stopassola Junior
 
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesUtilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesChristiano Anderson
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Christiano Anderson
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDBBrunno Gomes
 
Document store e Mongodb
Document store e MongodbDocument store e Mongodb
Document store e MongodbAline Ferreira
 
No sql Orientado a documento
No sql Orientado a documentoNo sql Orientado a documento
No sql Orientado a documentoAlex Martins
 
NoSQL com Zend Framework 2
NoSQL com Zend Framework 2NoSQL com Zend Framework 2
NoSQL com Zend Framework 2Flávio Lisboa
 
Curso mongo db com php
Curso mongo db com phpCurso mongo db com php
Curso mongo db com phpSuissa
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopDiego Sana
 
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
 
Processos iniciais do mapeamento OR
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento ORNécio de Lima Veras
 

Semelhante a Mongo db slides (20)

MongoDB na Campus Party
MongoDB na Campus PartyMongoDB na Campus Party
MongoDB na Campus Party
 
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
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDB
 
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesUtilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentes
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7
 
Mongodb workshop cinlug
Mongodb workshop cinlugMongodb workshop cinlug
Mongodb workshop cinlug
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDB
 
Mongopesl
MongopeslMongopesl
Mongopesl
 
Mongo
MongoMongo
Mongo
 
Python e MongoDB - Ensol
Python e MongoDB - EnsolPython e MongoDB - Ensol
Python e MongoDB - Ensol
 
Document store e Mongodb
Document store e MongodbDocument store e Mongodb
Document store e Mongodb
 
No sql Orientado a documento
No sql Orientado a documentoNo sql Orientado a documento
No sql Orientado a documento
 
NoSQL com Zend Framework 2
NoSQL com Zend Framework 2NoSQL com Zend Framework 2
NoSQL com Zend Framework 2
 
Curso mongo db com php
Curso mongo db com phpCurso mongo db com php
Curso mongo db com php
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day Workshop
 
Mongo db
Mongo dbMongo db
Mongo db
 
MAC5855 - NoSQL
MAC5855 - NoSQLMAC5855 - NoSQL
MAC5855 - NoSQL
 
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
 
Processos iniciais do mapeamento OR
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento OR
 

Mongo db slides

  • 2. MongoDB não siginifica o que vocês estão pensando! Momento politicamente correto
  • 3. 3
  • 4. MongoDB vem de humongous humongous = grande, enorme
  • 5. NoSQL? É Só Hype Ou É pra Valer? • NoSQL (Not Only SQL) é o termo genérico de BD que não segue o modelo relacional de dados; • A idéia não é nova, o CDS/ISIS de 1985 já era utilizado para guardar documentos em biblioteca de forma não relacional e não normalizada; • Ganhou notoriedade no meio dos anos 00 para soluções que “web scales” e com o BigTable do Google; • O objetivo é armazenar informação na forma de elementos chave/valor, não-normalizado e não relacional; • Hype? Pode ser, mas "está ai no mercado" e muitos produtos estão sendo feitos com essa tecnologia; • MongoDB não é o único NoSQL de sucesso: CouchDB, Cassandra, BigTable, Riak, MemBase, Redis, Hbase.
  • 6. Terminologia SQL (RDBMS) MongoDB • Database • Database • Table • Collection • Row(s) • (JSON) Documents • Query • Query • Index • Index • Partition • Shard
  • 7. Principais Características • Banco de dados orientados à documentos; • Escalável e de alto-desempenho; • Código aberto - desenvolvido e mantido pela 10gen; • Utiliza documentos JSON para o modelo de dados; • Consultas são baseadas em documentos; • Sharding = particionamento em múltiplos servidores; • Suporta internamente MapReduce; • Suporta operações atômicas em documentos simples; • Desenvolvido em C++; • Possui drivers para várias linguagens: Python, Java, PHP, Erlang, etc.; • Última versão estável: 1.8.1 (06 de Abril de 2011).
  • 8. Por Que JSON? • JSON (JavaScript Object Notation) é um formato leve de troca de dados, é um subconjunto pequeno de Javascript; • É independente de linguagem de programção, composto por pares de chave e valor; • As consultas são feitas por JSON e o retorno é sempre um documento JSON, ou uma lista de documentos JSON; • JSON é muito utilizado para o intercâmbio de informações na web (adios XML!); • A linguagem de comandos e funções internas do MongoDB é JavaScript.
  • 9. Documento JSON { "_id" : ObjectId("4d3f3574c405441a31000000"), "config" : { "max_range" : 10, "min_range" : 0, "type" : "range" }, "name" : "Linguagens", "description" : "Ranking de linguagens de programação" }
  • 10. Armazenamento • Os documentos JSON são internamente guardados como BJSON (formato binário) (< 16MB); • A espeficação GridFS permite guardar documentos grandes (> 16MB) de forma transparente; • O MongoDB usa um mecanismo de armazenamento em memória mapeada (Memory Mapped Storage Engine); • O gerenciador de memória virtual do S.O. fica responsável pelo cache de dados do MongoDB.
  • 11. Índices • Todo documento de uma collection contém uma chave padrão "_id" indexada; • O valor da chave “_id”: ObjectId("4d3727c33612f747d7000000"); • Qualquer chave do documento pode ser indexada (exceto em capped collections). > db.votes.ensureIndex({'obj.name': 1})
  • 12. Segurança • Recomenda-se o uso do MongoDB em ambientes confiáveis (rede privada e firewall); • Pode-se configurar autenticação por usuário e senha; • Para adicionar um usuário à uma database: > db.addUser("theadmin", "anadminpassword", true) • Para autenticar: > db.auth("theadmin", "anadminpassword")
  • 13. MapReduce • MongoDB suporta MapReduce; • A operação Map pode servir para modificar ou filtrar valores; • A operação Reduce para consolidar um conjunto de valores; • As operações de Map e Reduce são executadas de maneira distribuídas entre os shards do cluster. Map f(x) = {x*2} [1, 2, 3] [2, 4, 6] Reduce f(x, y) = {x+y} [12]
  • 14. Durabilidade • Operações que alteram os documentos são realizadas de maneira direta no BD, portanto não existem transações; • Não existem logs de transação, que garantam a durabilidade dos dados como fazem os RDBMS; • A durabilidade deve ser garantida pela replicação dos dados em diferentes servidores; • Desde a versão 1.7.5 é possível contar com um journaling de dados, o que deixa o banco mais robusto.
  • 15. GridFS • Armazenamento de arquivos; • Divide os arquivos em chunks de 256kb; • Armazena os metadados na collection fs.files, e as partes do arquivo na collection fs.chunks; • O MongoDB faz streaming do arquivo para a aplicação; • Facilidade para fazer seek em arquivos.
  • 16. Capped Collections • Collections com tamanho fixo; • Funciona como uma fila FIFO: primeiro a entrar, primeiro a sair; > db.createCollection("last_comments", {capped:true, size: 100000}) > db.last_votes.validate() OBS.: size em bytes
  • 17. Tailable Cursors • Igual a um “tail -f” do Unix, numa Capped collection. >>> finder = db.last_comments.find(tailable=True) >>> while True: >>> time.sleep(1) >>> for doc in finder: >>> print doc
  • 18. Sharding • Particionamento horizontal; • Database sharding: Distribui as collections entre os shards; • Collection sharding: Distribui os documentos de mesma chave entre os Shards; Collection cep: {uf: 'RS', local:'Posto Alegre', logr:'Rua General Câmara', cep: '90010-230'} >db.runCommand({ shardcollection : "cep", key : "uf" })
  • 20. Limitações • Sistemas de 32 bits existe a limitação de 2GB no tamanho do BD (limite de memória por processo, 64 bits é maior); • 4mb por documento JSON, mas pode ser extendido com uso de GridFS; • O número máximo de conexões que o MongoDB aceita, depende do limite de arquivos abertos do sistema operacional (ulimit -n); • Não é muito performático quando se necessita fazer "joins" entre documentos; • Não existe um esquema de locking tradicional e transações complexas.
  • 21. Instalação CentOS5 • http://www.mongodb.org/display/DOCS/CentOS+and+Fedora +Packages • Adicionar os repositórios da 10gen para o MongoDB o Estão no link acima • Com a ajuda do yum: $ yum install mongo-stable mongo-stable-server
  • 22. Teste da instalação $ grep dbpath /etc/mongod.conf dbpath=/var/lib/mongo $ sudo /etc/init.d/mongod start $ sudo /etc/init.d/mongod status mongod (pid 4745) is running... $ mongo MongoDB shell version: 1.6.5 connecting to: test > show dbs admin local test
  • 23. Utilizando o MongoDB > use tiobe; switched to db tiobe > var py = { language: "Python", position: 1, delta: +3 }; > printjson(py); { "language" : "Python", "position" : 1, "delta" : 3 } > db.tiobe.save(py); > db.tiobe.find(); { "_id" : ObjectId("4d63c372bbd24861417f9a19"), "language" : "Python", "position" : 1, "delta" : 3 }
  • 24. Utilizando o MongoDB > db.tiobe.save({language: "C++", position: 3, delta: 1}); > db.tiobe.save({language: "C", position: 2, delta: 0}); > db.tiobe.save({language: "Java", position: 1, delta: 0}); > db.tiobe.find(); { "_id" : ObjectId("4d63c372bbd24861417f9a19"), "language" : "Python", "position" : 1, "delta" : 3 } { "_id" : ObjectId("4d63c3d1bbd24861417f9a1a"), "language" : "C++", "position" : 3, "delta" : 1 } { "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"), "language" : "C", "position" : 2, "delta" : 0 } { "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"), "language" : "Java", "position" : 1, "delta" : 0 }
  • 25. Utilizando o MongoDB > db.tiobe.find()[0]; { "_id" : ObjectId("4d63c372bbd24861417f9a19"), "language" : "Python", "position" : 1, "delta" : 3 } > var cursor = db.tiobe.find(); > printjson(cursor[3]); { "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"), "language" : "Java", "position" : 1, "delta" : 0 }
  • 26. Utilizando o MongoDB > var cursor = db.tiobe.find().limit(2); > cursor.forEach(printjson); { "_id" : ObjectId("4d63c3d1bbd24861417f9a1a"), "delta" : 1, "language" : "C++", "position" : 3, "year" : 2011 } { "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"), "delta" : 0, "language" : "C", "position" : 2, "year" : 2011 }
  • 27. Utilizando o MongoDB > db.tiobe.update({language: "Python"}, {position: 4}); > db.tiobe.find({delta:0}); { "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"), "language" : "C", "position" : 2, "delta" : 0 } { "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"), "language" : "Java", "position" : 1, "delta" : 0 } > db.tiobe.find({delta:0}, {language:true}); { "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"), "language" : "C" } { "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"), "language" : "Java" }
  • 28. Utilizando o MongoDB > db.tiobe.find({position: {$lt: 4}}); { "_id" : ObjectId("4d63c3d1bbd24861417f9a1a"), "language" : "C++", "position" : 3, "delta" : 1 } { "_id" : ObjectId("4d63c3e2bbd24861417f9a1b"), "language" : "C", "position" : 2, "delta" : 0 } { "_id" : ObjectId("4d63c3fbbbd24861417f9a1c"), "language" : "Java", "position" : 1, "delta" : 0 } > db.tiobe.update({}, {$set: {year: 2011}}, false, true); { ... } > db.tiobe.remove({_id: ObjectId ('4d63c372bbd24861417f9a19')}); > db.tiobe.remove({}); TUDO!
  • 29. MongoDB Drivers • Drivers são extensões para uso emlinguagens de programação; • Suporte as linguagens de programação: o C/C++ o Python o Javascript o PHP o + Erlang, Java, Perl, Scala • Python: PyMongo.
  • 30. PyMongo • É o driver recomendado para uso do MongoDB com Python; • Instalação: o sudo pip install pymongo • Uso: >>> import pymongo >>> conn = pymongo.Conection() # localhost >>> db = conn.tiobe >>> print db.tiobe.find_one({'language': 'C++'}) {u'position': 3.0, u'_id': ObjectId('4d63c3d1bbd24861417f9a1a'), u'year': 2011.0, u'language': u'C++', u'delta': 1.0}
  • 31. >>> cursor = db.tiobe.find() >>> for elem in cursor: print elem • {u'_id': ObjectId('4d63c372bbd24861417f9a19'), u'year': 2011.0} • {u'position': 3.0, u'_id': ObjectId('4d63c3d1bbd24861417f9a1a'), u'year': 2011.0, u'language': u'C++', u'delta': 1.0} • {u'position': 2.0, u'_id': ObjectId('4d63c3e2bbd24861417f9a1b'), u'year': 2011.0, u'language': u'C', u'delta': 0.0} • {u'position': 1.0, u'_id': ObjectId('4d63c3fbbbd24861417f9a1c'), u'year': 2011.0, u'language': u'Java', u'delta': 0.0} • {u'position': 5.0, u'_id': ObjectId('4d63cba91d00876348d47b1e'), u'year': 2011.0, u'language': u'PHP', u'delta': -2.0} >>> cursor = db.tiobe.find({'delta': 0}) >>> print cursor.count() 2 Em resumo, total suporte do MongoDB com Python!
  • 32. Persistência de Objetos • ORM ou Object-Relational Mapping (Mapeamento Objeto- relacional) é o mecanismo para mapear modelos de objetos/ classes em armazenamento de banco; • É a maneira de construir persistência de objetos em termos de armazenamento em banco de dados; • Podemos usar o MongoDB para mapear objetos de linguagem de programação em BD; • Naturalmente não faz muito sentido chamar de ORM, porque bem... MongoDB não é relacional!
  • 33. MongoEngine • Mapeamento de objetos no modelo de documentos do MongoDB; • Muito parecido com a modelagem de objetos do Django. • Requer pymongo; • Instalação: $ sudo pip install mongoengine • Uso: o Ver a apresentação do demo "microblog".