KEMBAR78
MongoDB: Uma forma diferente de pensar no desenvolvimento | PPTX
Marcos Thomaz da Silva
Bacharel em Sistemas de Informação pela 
Universidade Federal do Acre 
Analista de Tecnologia da Informação da 
Universidade Federal do Acre 
Desenvolvedor em Linguagens como Clipper, 
Delphi, PHP e Python 
Entusiasta por Bancos de Dados e Otimização 
de Consultas
Banco de Dados NoSQL; 
Desenvolvimento iniciado em 2007 (10gen); 
Primeiro Release em 2009 (MongoDB Inc.); 
Escrito em C++; 
Multi-Plataforma (Windows, Linux, OSX); 
OpenSource; 
Banco de Dados Orientado a Documentos;
Binários para 32 e 64 bits; 
Pacotes disponíveis para várias distribuições 
Linux (Red Hat, CentOS, Fedora, Debian, ...); 
Utiliza Javascript como “motor” do sistema; 
Documentos JSON; 
É NoSQL, não OO
Suporte a principais tipos de dados: 
 String; 
 Double; 
 Inteiros; 
 Date; 
 Null; 
 Binary Data; 
 TimeStamp; 
 Boolean.
E suporte a alguns tipos especiais: 
 Array; 
 Regular Expressions; 
 Javascript ; 
 ObjectID; 
 Object; 
Mas espere um pouco, não era OO!
“JSON (JavaScript Object Notation - Notação 
de Objetos JavaScript) é uma formatação 
leve de troca de dados.” 
“JSON é em formato texto e completamente 
independente de linguagem...” 
Fonte: http://www.json.org/json-pt.html
Suporte às principais operações DML (Data 
Manipulation Language): 
 Insert; 
 Update; 
 Delete; e 
 Select.
MongoDB é suportado pelas seguintes 
linguagens: 
 Javascript; 
 C, C++, Haskell; 
 PHP, C#, Python, Perl, Ruby 
 Erlang, Scala e Java;
Quem usa: 
 CraigList; 
 eBay; 
 Foursquare; 
 SourceForge; 
 The NewYork Times;
Possui estrutura semelhante à outros Bancos 
de Dados: 
 Tabelas; 
 Registros; 
 Campos; 
 Índices;
Semelhança com uso do MySQL: 
 Conexão com o servidor; 
 Comando use para indicar qual database; 
 Sem integridade referencial (MyISAM); 
 Criado dinamicamente.
Tabelas: 
 No MongoDB são chamadas de Collections; 
Campos: 
 Sem restrição no nome do campo;
Chamados de Documents (Documentos); 
São uma estrutura JSON; 
Podem ter diferentes campos em uma 
mesma Collection;
Podem ser criados índices de ordem 
ascendente ou descendente; 
Podem ser criados índices compostos; 
Podem ser criados índices únicos 
(considerando ou ignorando nulos); 
Existem chaves-primárias (por padrão são 
campos nomeados por _id) 
Permite índices para busca textual (text 
indexes)
Permite consultas por quaisquer campos das 
Collections; 
Permite consultas em arrays (mesmo campos 
do tipo array); 
Permite consultas com diversos filtros, 
aplicando instruções como order by, limit e 
skip;
Permite os principais comandos de 
agregação: 
 Sum; 
 Max; 
 Min; 
 Count; 
 Avg;
Tipos GeoJSON; 
Cadastro de Polygons, Point’s, LineString; 
Consultas baseadas em coordenadas: 
 União; 
 Intersecção; e 
 Proximidade. 
Criação de índices para melhora das 
consultas espaciais.
Executáveis servidores (gerenciadores do 
banco): 
Banco de Dados Executável 
MySQL mysqld 
Oracle oracle 
MongoDB mongod
Executáveis de consulta: 
Banco de Dados Executável 
MySQL mysql 
Oracle sqlplus 
PostgreSQL psql 
MondoDB mongo
MongoDB não suporta triggers nem 
procedures;
Replicação; 
Cluster; 
mongoimport / mongoexport; 
Console Interativo de Consulta; 
Servidor REST; 
Ferramentas de Backup/Restore; 
Monitoramento (mongotop, mongostat); 
Segurança
Instalação/Configuração Simples 
Servidor Leve; 
Servidor REST; 
Text Search com Multiplos Campos; 
Alta Performance; 
Alta Disponibilidade; 
Facilmente Escalável; 
Performance em consultas;
Explain; 
Instrução Hint; 
Índices; 
Tablespaces; 
Sharding;
Nem tudo são flores...
http://www.mongodb.org/ 
 Site oficial do MongoDB 
https://education.mongodb.com/ 
 Site com cursos oficiais gratuitos 
http://www.mongodb.org/about/production-deployments/ 
 Lista de empresas que usam MongoDB

MongoDB: Uma forma diferente de pensar no desenvolvimento

  • 1.
  • 2.
    Bacharel em Sistemasde Informação pela Universidade Federal do Acre Analista de Tecnologia da Informação da Universidade Federal do Acre Desenvolvedor em Linguagens como Clipper, Delphi, PHP e Python Entusiasta por Bancos de Dados e Otimização de Consultas
  • 3.
    Banco de DadosNoSQL; Desenvolvimento iniciado em 2007 (10gen); Primeiro Release em 2009 (MongoDB Inc.); Escrito em C++; Multi-Plataforma (Windows, Linux, OSX); OpenSource; Banco de Dados Orientado a Documentos;
  • 4.
    Binários para 32e 64 bits; Pacotes disponíveis para várias distribuições Linux (Red Hat, CentOS, Fedora, Debian, ...); Utiliza Javascript como “motor” do sistema; Documentos JSON; É NoSQL, não OO
  • 5.
    Suporte a principaistipos de dados:  String;  Double;  Inteiros;  Date;  Null;  Binary Data;  TimeStamp;  Boolean.
  • 6.
    E suporte aalguns tipos especiais:  Array;  Regular Expressions;  Javascript ;  ObjectID;  Object; Mas espere um pouco, não era OO!
  • 7.
    “JSON (JavaScript ObjectNotation - Notação de Objetos JavaScript) é uma formatação leve de troca de dados.” “JSON é em formato texto e completamente independente de linguagem...” Fonte: http://www.json.org/json-pt.html
  • 8.
    Suporte às principaisoperações DML (Data Manipulation Language):  Insert;  Update;  Delete; e  Select.
  • 9.
    MongoDB é suportadopelas seguintes linguagens:  Javascript;  C, C++, Haskell;  PHP, C#, Python, Perl, Ruby  Erlang, Scala e Java;
  • 10.
    Quem usa: CraigList;  eBay;  Foursquare;  SourceForge;  The NewYork Times;
  • 11.
    Possui estrutura semelhanteà outros Bancos de Dados:  Tabelas;  Registros;  Campos;  Índices;
  • 12.
    Semelhança com usodo MySQL:  Conexão com o servidor;  Comando use para indicar qual database;  Sem integridade referencial (MyISAM);  Criado dinamicamente.
  • 13.
    Tabelas:  NoMongoDB são chamadas de Collections; Campos:  Sem restrição no nome do campo;
  • 14.
    Chamados de Documents(Documentos); São uma estrutura JSON; Podem ter diferentes campos em uma mesma Collection;
  • 15.
    Podem ser criadosíndices de ordem ascendente ou descendente; Podem ser criados índices compostos; Podem ser criados índices únicos (considerando ou ignorando nulos); Existem chaves-primárias (por padrão são campos nomeados por _id) Permite índices para busca textual (text indexes)
  • 16.
    Permite consultas porquaisquer campos das Collections; Permite consultas em arrays (mesmo campos do tipo array); Permite consultas com diversos filtros, aplicando instruções como order by, limit e skip;
  • 18.
    Permite os principaiscomandos de agregação:  Sum;  Max;  Min;  Count;  Avg;
  • 19.
    Tipos GeoJSON; Cadastrode Polygons, Point’s, LineString; Consultas baseadas em coordenadas:  União;  Intersecção; e  Proximidade. Criação de índices para melhora das consultas espaciais.
  • 20.
    Executáveis servidores (gerenciadoresdo banco): Banco de Dados Executável MySQL mysqld Oracle oracle MongoDB mongod
  • 21.
    Executáveis de consulta: Banco de Dados Executável MySQL mysql Oracle sqlplus PostgreSQL psql MondoDB mongo
  • 22.
    MongoDB não suportatriggers nem procedures;
  • 23.
    Replicação; Cluster; mongoimport/ mongoexport; Console Interativo de Consulta; Servidor REST; Ferramentas de Backup/Restore; Monitoramento (mongotop, mongostat); Segurança
  • 24.
    Instalação/Configuração Simples ServidorLeve; Servidor REST; Text Search com Multiplos Campos; Alta Performance; Alta Disponibilidade; Facilmente Escalável; Performance em consultas;
  • 27.
    Explain; Instrução Hint; Índices; Tablespaces; Sharding;
  • 45.
    Nem tudo sãoflores...
  • 49.
    http://www.mongodb.org/  Siteoficial do MongoDB https://education.mongodb.com/  Site com cursos oficiais gratuitos http://www.mongodb.org/about/production-deployments/  Lista de empresas que usam MongoDB

Notas do Editor

  • #2 Boa noite a todos!
  • #3 Bem, meu nome é Marcos Thomaz da Silva, sou graduado em Sistemas de Informação pela UFAC e Analista de TI da mesma universidade.
  • #4 Banco de dados NoSQL, começou a ser desenvolvido pela 10gen em 2007, sendo que seu primeiro release foi em 2009. A empresa 10gen, acabou mudando de nome para MongoDB Inc. Ele foi escrito em C++, é multi plataforma, estando disponível para os sistemas operacionais Windows, Linux e OSX. É Open-Souce e orientado a documentos. De acordo com seus criadores, “MongoDB preenche a lacuna entre modelagem chave/valor (que são bem rápidas e escaláveis) e os tradicionais bancos de dados relacionais”.
  • #5 Utiliza Javascript como “motor” do sistema, ou seja, as solicitações, funções e script’s serão todos em Javascript.
  • #6 Tem suporte aos principais tipos de dados.
  • #7 E suporta também alguns tipos especiais como Arrays, que também existem em outros bancos de dados como por exemplo o PostgreSQL, Expressões Regulares, e outros três tipos: Javascript, ObjectID e o Object. Foi mencionado Javascript porque pode-se armazenar funções javascript em campos, executando-as quando necessário. ObjectID é um tipo de dados que ocupa 12 bytes e é usado para gerar chaves únicas, com base em dados do processador, hora, ID do processo e um contador randômico. Suporta também o tipo Object. Mas espere um pouco lembram-se que eu citei qu enão era OO? O mongo utiliza documentos Json que teriam a seguinte definição... O ObjectID é um tipo de 12 bytes onde 4 representam os segundos, 3 um identificador da máquina, 2 o ID do processo, 3 um contador (que inicia com um valor randômico) – Usado para criar campos chave-primária (espécie UUID)
  • #8 Ou seja, apesar do Json servir como um tipo de orientação a objetos no javascript, e ter esse nome de object, nada mais é do que uma formatação que permite a troca (e organização ) de dados de forma mais leve que um XML. E o tipo Object no qual me referi no slide anterior é sobre esse tipo de “Objeto”, os documentos JSON.
  • #9 Claro! Tudo com comandos específicos que veremos a seguir.
  • #10 Vale lembrar que por ser suportado por estas linguagens, pode-se fazer uso de ferramentas destas linguagens juntamente com o MongoDB, tais como o pentaho (que é uma ferramenta de BI) e framework’s de desenvolvimento web (Rails do Ruby e Django do Python).
  • #11 Diversas empresas vem utilizando e seu uso é cada vez maior. Craigslist – Empresa de Classificados Web. Foursquare – Redes social para dispositivos moveis. Dentre estas, eu gostaria de destacar a CraigList, cuja base de dados em MongoDB atualmente contém mais de 2 Bilhões de documentos, com aproximadamente 5 Tera de tamanho.
  • #13 A forma de conexão com a base de dados se assemelha a conexão realizada com bancos de dados MySQL, ou seja, Conecta-se ao server e solicita-se o uso do banco de dados (através do comando use). Também não possui integridade referencial, assim como as bases MyISAM do MySQL. Um fato interessante é que o banco de dados é criado dinamicamente, ou seja, não existe a necessidade de comandos com os Create Tables ou outro do tipo.
  • #14 As Tabelas no MongoDB são chamadas de Collection’s. Seguindo o mesmo caminho do banco de dados, tanto as tabelas quanto os campos são dinâmicos, ou seja, os documentos armazenados em uma mesma collection não precisam necessariamente ter os mesmos campos, a mesma estrutura. Por isso o nome de tabela não atenderia, ficando melhor definição a de coleção. Os nomes dos campos podem conter letras e números exceto ponto e o $. Os dados armazenados são representados como JSON, mas mantém-se numa estrutura chamada de BSON, que é a representação binária, serializada, de um JSON.
  • #15 No MongoDB os registros ou linhas são chamados de Documents. Como já havia mencionado, é uma estrutura JSON que contém informações. Como as linhas são chamadas de Documents, o nome de Collection ao invés de tabela mais uma vez faz sentido. Também como já foi citado, Uma mesma Colection pode conter diferentes Documents, sendo permitido que cada um tenha uma estrutura, ou seja, nomes e tipos de campos completamente diferentes um do outro. Se não for especificado uma chave primária para um registro, por padrão, é atribuído um valor do tipo ObjectID, mas pode ser de qualquer tipo.
  • #16 O mongoDb permite a criação de índices, de forma semelhante ao dos SGBD’s, exceto pelo fato de que não existem índices de chave estrangeira.
  • #17 Queries ou consultas, podem ser realizadas sobre quaisquer campos das collections, inclusive em campos do tipo Array e Object. No caso do Skip, seria equivalente ao offset do postgreSQL por exemplo, usado para saltar os primeiros N registros antes de exibir os registros;
  • #18 Aqui temos um exemplo simplificado de como a engine realiza as consultas no banco de dados.
  • #19 Permite funções de agregação tais como Sum..... Além destas funções, é possível criar funções específicas através de funções Javascript, que podem ser rodadas diretamente no banco de dados.
  • #20 Uma característica interessante é que a engine do Mongo permite a utilização de GeoJSON, que é um tipo de JSON para geolozalização. Com ele podemos especificar geometrias do tipo Polygon, Point e LIneString, além de operações como União, Intersecção e Proximidade de uma determinada geometria. Trabalha de forma semelhante ao Postgis do POstgreSQL, permitindo também a criação de índices para um melhor desempenho em operações neste formato.
  • #23 Não possui o recurso de triggers ou procedures. Porém, no caso das procedures, pode ser suprida através da execução de funções javascript, que realizem operações sobre as collections de um banco de dados.
  • #24 Mongoimport/export realizam a importação/exportação de formato bson para json e vice versa. A segurança no mongoDB é um ponto importante e deve ser estudado ao se pensar em seu uso, pois por padrão, vem com a autenticação desabilitada, e a mesma deve ser ativada e configurada de acordo com a necessidade. Existem tambpem ferramentas para criptografia dos dados, o que aumenta um pouco mais a segurança.
  • #25 Alguns pontos favoráveis, pelo menos que levem-nos a testar o Mongo são... O Servidor REST permitiria que uma aplicação web, a partir de sua camada cliente, ou seja, de script’s javascript ou flash, realize consultas diretamente no banco de dados que, apesar de não recomendável, pode ser utilizado em testes. Mas O grande motivo que me levou a testar e estudar esse banco de dados foi a Performance. Para exemplificar, foi realizado um pequeno teste
  • #26 O teste foi simples, onde era realizada a inserção de alguns dados em uma base PostgreSQL, e numa base MongoDB e medido o tempo de inserção. Na mesma aplicação, era realizada a consulta de um registro aleatório, medido o tempo de resposta e avaliado. O teste mostrou que inserção no PostgreSQL é mais rápida, porém, a recuperação é mais lenta. Ambas as bases sem índices, e foram realizadas em uma mesma máquina. O teste foi repetido 10 vezes onde o valor apresentado é o que atingiu a média. Também vale lembrar que nenhum tipo de configuração foi realizada com nenhum dos 2 bancos de dados, ou seja, ambos estavam com suas configurações padrões.
  • #27 Resolvi então incrementar um pouco mais o teste e criei um índice na base de dados POstgreSQL e resolvi executar novamente o teste de consulta, obtendo um resultado interessante: O MongoDB teve maior performance mesmo estando sem índices criados. Claro que não é um comparativo oficial, mas ajuda a entender a diferença no desempenho.
  • #28 E se ainda assim o desempenho não for suficiente, existe a possibilidade de se realizar um tratamento mais fino, avaliando as consultas com o Explain e, se for o caso indicando o melhor índice para a mesma de forma explicita (usando o hint) ou Criando novos índices que atendam as necessidades. Outras opções seriam a criação de TableSpaces e realização de Sharding. No Mongo não existe exatamente as tablespaces, mas sim a opção de selecionar outros discos/partições de armazenamento, que atuam de forma idêntica as tablespaces. O Sharding é um tipo de recurso que permite escalar horizontalmente, aumentando a quantidade de instâncias. É um recurso semelhante ao Particionamento de Tabelas, mas realizado com Banco de Dados inteiro.
  • #47 O que eu quis demonstrar aqui foi o uso de funções javascript, dentro de comandos de agregação. Isso permite que funções de agregação possam ser muito flexíveis, apesar de, a primeira vista, parecer confuso.
  • #48 De uma forma geral, eu quis apresentar para vocês uma forma diferente utilizar e gerenciar uma base de dados. O MongoDB apesar de ser um banco de dados novo (apenas 4 anos), já vem ganhando espaço em meio a outros e se destacando pela simplicidade, quantidade de recursos e principalmente o desempenho. Cabe salientar que temos diversos outros bancos de dados NoSQL no mercado, tais como CouchDB (OO), Redis (Key/Value), DB4O (OO), Cassandra, e muitos outros O crescimento não só do MongoDB como dos outros bancos NoSQL, eu atribuo mais a simplicidade e facilidade de manutenção, uma tendência que pode ser vista tambem no desenvolvimento de software’s, com framework’s cada vez tendo maise mais recursos.
  • #49 Assim como todas as outras ferramentas de desenvolvimento, cabe um pouco de bom senso e experiência. O ponto chave é saber exatamente o que se precisa, o que cada ferramenta tem a oferecer, para só então escolhermos uma ferramenta que nos atenda com maior precisão. Se precisar de desempenho e escalabilidade, e não precise de transações, talvez seja um bom momento para utilizá-lo, caso contrário, a sugestão é utilizar uma base relacional convencional. Cabe também testes mais “parrudos” com um banco deste porte pois apesar de se ter notícias de uma base de aproximadamente 5TB, bases muito maiores são utilizadas, como por exemplo, uma das bases do SERPRO, com cerca de 40TB.