Apresentação: 
Ari Stopassola Junior 
@stopassola
Ari Stopassola Junior 
Bacharel em Informática com ênfase em Análise de 
Sistemas pela Unisinos, cursou mestrado em Engenh...
Roadmap 
• Conceito de bases de 
dados NoSQL 
• cases 
• comparações com o 
modelo relacional 
• expressões SQL x 
MongoDB...
NoSQL 
• Not Only SQL (poderia ser NOSQL) 
• Movimento de bancos de dados não 
relacionais 
• Também chamados: Modelo Rela...
Taxonomia das bases NoSQL 
• Documento (XML ou JSON) 
– RavenDB, CouchDB, MongoDB 
• Orientado a Objetos 
– Db4o 
• Chave/...
Quem usa NoSQL? 
• eBay (pioneiro) 
• New York Times 
• Foursquare 
• Electronic Arts 
• GitHub 
• SAP 
• Disney 
• Twitte...
Abordagens 
ACID 
• Atomic 
• Consistent 
• Isolated 
• Durable 
• Integridade 
• Consistência 
• Conservador 
BASE 
• Bas...
• Responsável por 438 casamentos ao dia nos 
EUA 
• Algoritmo “Compatibility Matching System” 
reduz significativamente o ...
Base orientada a documentos 
Fonte: livro “MongoDB and PHP” de Steve Francia publicado pela O’Reilly
Por quê? 
• Sistemas Orientados à Objetos 
requer ORM (Object-Relational 
Mapping) 
• Normalização precisa de JOINs 
• Com...
Sharding: escalabilidade 
Horizontalmente escalável 
A 
W 
T L 
Índice “C” 
A 
W 
T L 
F 
Y 
U 
P 
K 
S 
V 
Z
Replica set: redundância
Diagrama ER do 
catálogo de produtos 
do Magento
Modelagem relacional
Modelagem 
Orientada a 
Documentos 
Organização 
interna
AMP
MongoDB 
http://www.mongodb.org 
• Nome vem da expressão huMONGOus 
que significa “extremamente enorme” 
• Banco de dados ...
Expressões SQL em 
MongoDB 
SQL MongoDB 
Database Database 
Table Collection 
Index Index 
Row Document 
Column Field 
Joi...
Hierarquia 
• Bancos de dados armazenam coleções 
• Coleções possuem documentos 
• No contexto PHP, documentos são arrays ...
Ready, set… 
GO!
Instalação manual: OSX e Linux 
1) Baixe o binário do MongoDB em http://www.mongodb.org/downloads 
Descompacte o arquivo m...
Instalação: Windows 
• Download (certifique-se da arquitetura: 32 ou 
64bit) 
• Descomprimir no C:mongodb-win32-i386-2.x.x...
Driver para PHP 
https://github.com/mongodb/mongo-php-driver 
• Mantido por Derick Rethans (autor do 
xDebug e vários outr...
Instalação do driver PHP para mongoDB 
http://pecl.php.net/package/mongo 
# sudo pecl install mongo 
http://soupforthegirl...
Habilite a extensão PHP no 
ZendServer CE
Verifique se o módulo foi 
habilitado: phpinfo()
Documentação antiga 
• A partir da versão 1.3.0 do driver, Derick 
Rethans mudou o nome da classe de 
Mongo para MongoClie...
phpMoAdmin 
1. Acesse: 
http://www.phpmoadmin.com/ 
2. Faça o download do phpmoadmin.zip, 
descomprima e copie o script 
m...
Anatomia do código PHP 
<?php 
$conexao = new MongoClient(); 
$db = $conexao->nomebase; 
$clientes = array( 
'nome' => "Ar...
Conexão 
//Conecta em localhost:27017 
$conexao = new MongoClient(); 
//Conecta no host remoto na porta default 
$conexao ...
Conexão (mais elegante) 
try { 
$conexao = new MongoClient(); 
} 
catch (MongoConnectionException $e){ 
die($e->getMessage...
Base de dados 
$db = $conexao->nomebase; 
//Formato alternativo 
$db = $conexao->selectDB('nomebase'); 
ATENÇÃO: se a base...
Coleção 
//Faz referência a coleção 
$colecao = $db->clientes; 
//Formato direto, partindo da conexão 
$colecao = $conexao...
Inserção 
Documento == Array PHP 
$clientes = array( 
'nome' => "Ari Stopassola Junior", 
'endereco'=> "Estrada do Carazal...
Inserção: documento dentro de 
documento 
$passeio = array( 
"nome" => "Raízes Coloniais", 
"valor" => 90, 
"opcionais” =>...
Dot notation 
db.voucher.find({ 
'pacotes.passeios.nome': "Tour Uva e Vinho”})
batchInsert 
$anuncios[] = array( 
'nome' => 'iPod', 
'modelo' => 'Touch', 
'capacidade' => '16Gb', 
); 
$anuncios[] = arr...
Consulta 
//Busca TODOS 
$elementos = $colecao->find(); 
foreach ($elementos as $objeto) { 
echo $objeto['endereco']."n"; ...
find versus findone 
findone retorna um objeto do tipo MongoId 
print_r($resultado); 
http://php.net/manual/pt_BR/class.mo...
ObjectId 
(equivalente a PK) 
• Cada documento (registro) recebe um 
código único e imutável, chamado 
ObjectId 
• Esse id...
ObjectID 
✓ 
$id = new MongoId('54526904b7f83ac71d0041a7'); 
$resultado = $colecao->findone(array('_id' => $id)); 
print_r...
Como referenciar um ObjectId 
> new ObjectId 
ObjectId("51b278e1fc431ab4f7484cd7") 
Atenção: ObjectId é um objeto e não um...
Uso do $ nos operadores 
✓ 
✗ 
$c->find(array('dist' => array('$lt' => 40))); 
$c->find(array("dist" => array("$lt" => 40)...
Segurança: SQL Injection 
• SQL 
– todas as operações (select, delete, drop 
etc) são passadas ao banco de dados como 
str...
• Cenário: 
Request Injection 
– http://url/script.php?usuario=ari 
$c->find(array("usr" => $_GET['usuario'])); 
• Ataque:...
Persistência de Objeto 
<?php 
$conexao= new MongoClient(); 
$db = $conexao->agencia; 
$passeio = new stdClass(); 
$passei...
class Clientes{ 
public $nome; 
public $trocas; 
public function __construct($n, array $trocas){ 
$this->nome = $n; 
$this...
$imovel1 = new Imoveis("Cabana Carazal", "Estrada carazal, 3744"); 
$trocas[] = new Trocas(new DateTime, $imovel1); 
$imov...
Paginação 
$elementos = $c->find()->limit(2); 
$elementos = $c->find()->skip(3); 
//1 é ascendente e -1 descendente 
$elem...
Paginação: encadeando 
$e = $c->find()->limit(2)->skip(1)->sort(array('nome'=>-1)); 
foreach($e as $item){ 
print_r($item)...
What’s happening? 
• Não criamos a base de dados 
• Não utilizamos as cláusulas SQL: CREATE 
TABLE, auto_increment, PRIMAR...
Teorema de Brewer 
• Em 2000 Eric Brewer definiu a equação 
CAP 
• Só pode escolher DUAS (das três 
• Consistência: client...
mongoDB é fully consistent 
• Realiza operações atômicas no 
documento 
• Por natureza, dados são agrupados em 
um único d...
Fire and forget it 
ACID x BASE 
• Inserção assíncrona – comportamento 
padrão: 
$colecao->insert($clientes); 
–Não bloque...
Update 
• Dois métodos 
– Substituição (de tudo) 
– Modificação (somente daquilo que se deseja)
ATENÇÃO: update por substituição 
de array PHP pelo documento inteiro 
Use 
'$push'
Update in place 
• Operador $set é atômico e mais eficiente, portanto evite a 
$colecao->update( 
array( '_id' => new Mong...
update – adicionando campos 
aninhados 
$colecao->update( 
array( '_id' => new MongoId('4fb69113550a6bdd02000000') ), 
arr...
Adicionando (append) 
$colecao->update( 
array( '_id' => new MongoId('4fb69113550a6bdd02000000') ), 
array( '$push'=> arra...
Método save 
• save é um wrapper para os métodos 
insert e update 
• Se passar um objeto _id ele edita o 
registro através...
save (agindo como update) 
$anuncio = array( 
'nome' => 'MacBook', 
'modelo' => 'Pro', 
'tela' => '13"', 
'tela_tipo' => '...
Excluíndo 
$colecao->remove(array 
('_id' => new MongoId('545280bab7f83ac71d0041a9') 
)); 
$passeios->remove(array("nome" ...
Trabalhando com arrays: $in, 
$nin e $all 
$cursor = $colecao->find( 
array('assessorios' => 
array('$in' => 
array('caixa...
ATENÇÃO: excluíndo sem critério 
$colecao->remove(); 
$colecao->drop();
Índices 
$criterio = array('num' => array('$gt' => 50000, '$lt' => 
500002)); 
print_r($c->find($criterio)->explain());
Índices: adicionando 
$c->ensureindex(array('num' => 1));
Operadores de comparação 
Operador Significado 
$gt Greater than (maior que) 
$gte Greater than equal (maior igual) 
$in I...
Operadores de avaliação: 
Expressões Regulares 
$where = array('nome' => array( 
'$regex' => new MongoRegex("/ari/i"))); 
...
Projeção 
Especifica quais campos serão retornados. Sintaxe: 
find({critério},{projeção}) 
$projecao = array( "_id" => fal...
ALERTA: (Projeção) 
$proj = array( "_id" => false, 
"nome" => true, 
"passeio" => true, 
"rg" => false, 
"datahora" => fal...
Tenho como hospedar? 
1 
2 
3
Ferramentas de administração 
http://docs.mongodb.org/ecosystem/tools/administration-interfaces/ 
• Fang of Mongo 
https:/...
Vasta bibliografia…
Programa de certificação 
• C100DBA 
MongoDB Certified DBA Associate Exam 
• C100DEV 
MongoDB Certified Developer Associat...
Referências 
• http://nosql-database.org/ 
• http://www.php.net/manual/en/mongo.tutor 
ial.php 
• https://mongolab.com 
• ...
Contatos 
E-mail: 
arijunior@gmail.com 
Twitter: @stopassola 
Skype: stopassola 
LinkedIn: 
http://pt.linkedin.com/in/stop...
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDB
Próximos SlideShares
Carregando em…5
×

Desenvolvimento de aplicações PHP com MongoDB

3.422 visualizações

Publicada em

Apresentação realizada no dia 8/11/2014 no evento TchêLinux Bento Gonçalves edição 2014 - http://bento.tchelinux.org
Falei sobre os conceitos de bases de dados NoSQL, cases, comparações com o modelo relacional, expressões SQL x MongoDB (orientado à documentos), instalação, recursos do MongoDB, operações via console, modelagem (abordagem embedded), driver PHP, anatomia do código PHP, CRUD (Create, Read, Update and Delete), ObjectId, operadores, segurança, persistência de objetos, tratamento de arrays (documentos aninhados), índices (performance), projeção, agregação, hospedagem, ferramentas de administração e programa de certificação.

Desenvolvimento de aplicações PHP com MongoDB

  1. 1. Apresentação: Ari Stopassola Junior @stopassola
  2. 2. Ari Stopassola Junior Bacharel em Informática com ênfase em Análise de Sistemas pela Unisinos, cursou mestrado em Engenharia Informática e de Computadores pelo Instituto Superior Técnico da Universidade Técnica de Lisboa (Portugal), perito judicial 'ad hoc' especializado em TI (mantenedor do site PERITO.inf.br), Zend Certified Engineer (PHP 5.3) e Zend Certified PHP Engineer (PHP 5.5) #ZEND004019, Certified ScrumMaster pela Scrum Alliance #203613, Microsoft Certified Professional (MCP), consultor web e PHP evangelist.
  3. 3. Roadmap • Conceito de bases de dados NoSQL • cases • comparações com o modelo relacional • expressões SQL x MongoDB (orientado à documentos) • instalação • recursos do MongoDB • operações via console • modelagem (embedded) • driver PHP • anatomia do código PHP • CRUD (Create, Read, Update and Delete) • ObjectId • operadores • segurança • persistência de objetos • tratamento arrays (documentos aninhados) • índices (performance) • projeção • hospedagem • ferramentas de administração • programa de certificação
  4. 4. NoSQL • Not Only SQL (poderia ser NOSQL) • Movimento de bancos de dados não relacionais • Também chamados: Modelo Relacional Não Normalizado (MRNN) • Seria mais apropriado dizer então “No relational” pois alguns SGBDs possuem interface SQL, embora sejam categorizados como NoSQL. Ex.: OrientDB
  5. 5. Taxonomia das bases NoSQL • Documento (XML ou JSON) – RavenDB, CouchDB, MongoDB • Orientado a Objetos – Db4o • Chave/Valor (Key/Value) – Redis, SimpleDB, Hbase, MemcacheDB, Riak, Berkeley DB • Tabular (inspirado no BigTable do Google) – Cassandra (Apache), Hypertable, Hbase • Orientado a colunas (relacionais com características NoSQL) – Vertica, MonetDB, LucidDB, Infobright • Grafos (Graph) – Neo4j, OrientDB, Titan, DEX, InfiniteGraph, InfoGrid, HyperGraphDB • Outros – Chordless, Mnesia Fonte: http://pt.wikipedia.org/wiki/NoSQL
  6. 6. Quem usa NoSQL? • eBay (pioneiro) • New York Times • Foursquare • Electronic Arts • GitHub • SAP • Disney • Twitter “Fifteen months ago, It took two weeks to perform ALTER TABLE on the statuses [tweets] table.” (setembro/2010) Fonte: http://www.mongodb.org/about/production-deployments/
  7. 7. Abordagens ACID • Atomic • Consistent • Isolated • Durable • Integridade • Consistência • Conservador BASE • Basic Availability • Soft-state • Eventual consistency • Tolerância • Disponibilidade • Agressivo Fonte: http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf
  8. 8. • Responsável por 438 casamentos ao dia nos EUA • Algoritmo “Compatibility Matching System” reduz significativamente o número de separações • +51 milhões de usuários • Processa 1 bilhão de combinações de casais • Sob RDBMS demorava 2 semanas processando Fonte: http://www.mongodb.com/press/mongodb-powers-critical-eharmony-compatibility-application-processing-1-billion-matches-dail-0 http://www.mongodb.com/presentations/big-dating-eharmony
  9. 9. Base orientada a documentos Fonte: livro “MongoDB and PHP” de Steve Francia publicado pela O’Reilly
  10. 10. Por quê? • Sistemas Orientados à Objetos requer ORM (Object-Relational Mapping) • Normalização precisa de JOINs • Complexidade dos relacionamentos • Problemas ao escalar: vertical versus horizontal
  11. 11. Sharding: escalabilidade Horizontalmente escalável A W T L Índice “C” A W T L F Y U P K S V Z
  12. 12. Replica set: redundância
  13. 13. Diagrama ER do catálogo de produtos do Magento
  14. 14. Modelagem relacional
  15. 15. Modelagem Orientada a Documentos Organização interna
  16. 16. AMP
  17. 17. MongoDB http://www.mongodb.org • Nome vem da expressão huMONGOus que significa “extremamente enorme” • Banco de dados open source: https://github.com/mongodb/ • Criado pela 10gen em C++, orientado a documentos (formato JSON/BSON) • Escalável JavaScript Object Notation • Schemaless (não há colunas ou tipos de dados)
  18. 18. Expressões SQL em MongoDB SQL MongoDB Database Database Table Collection Index Index Row Document Column Field Joining Embedding & linking Partition Shard Fonte: “Reference Cards for MongoDB”
  19. 19. Hierarquia • Bancos de dados armazenam coleções • Coleções possuem documentos • No contexto PHP, documentos são arrays multidimensionais • Do ponto de vista do MongoDB, são estruturas em JSON: Imagem extraída de: http://habrahabr.ru/post/156633
  20. 20. Ready, set… GO!
  21. 21. Instalação manual: OSX e Linux 1) Baixe o binário do MongoDB em http://www.mongodb.org/downloads Descompacte o arquivo mongodb-osx-x86_64-2.x.x.tgz 2) Renomeie o diretório (resultado da descompactação) para um nome mais apropriada. Ex.: mongodb 3) Abra o terminal e adicione ao final do arquivo /etc/paths o caminho: sudo vim /etc/paths Adicione a linha (de acordo com o diretório onde o MongoDB se encontra). Ex.: /Users/ari/mongodb/bin echo "export PATH=$PATH:/Users/ari/mongodb/bin" > ~/.bash_profile 4) Crie diretórios para armazenar as bases. O binário disponibilizado pela 10gen prevê que a base ficará na raiz do sistema operacional: sudo mkdir -p /data/db/ sudo chown `id -u` /data/db 5) Inicie o serviço (deamon): ./mongod & sudo ./mongod & (dependendo das permissões de usuário) 6) Abra a console do MongoDB e realize um teste: mongo > db.passeios.save( { a : 1 } ) > db.passeios.find() Método alternativo ao passo 3
  22. 22. Instalação: Windows • Download (certifique-se da arquitetura: 32 ou 64bit) • Descomprimir no C:mongodb-win32-i386-2.x.x • Renomear a pasta para C:mongodb • Abra o terminal como usuário Administrador • Crie o diretório c:datadb cd .... md data md datadb • Execute o deamon do MongoDB: c:mongodbbinmongod.exe • Em outra console execute o client: c:mongodbbinmongo.exe Fonte: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/
  23. 23. Driver para PHP https://github.com/mongodb/mongo-php-driver • Mantido por Derick Rethans (autor do xDebug e vários outros projetos significativos): http://derickrethans.nl • http://docs.mongodb.org/ecosystem/drivers/p hp/ Foto: http://steve.maraspin.net/photo/gallery/conferences/2012-phpday-verona-italy/
  24. 24. Instalação do driver PHP para mongoDB http://pecl.php.net/package/mongo # sudo pecl install mongo http://soupforthegirlysoul.blogspot.com.br/2012/03/sunday-smiles-optimism-opportunists-and.html Adicione a linha extension=mongo.so no php.ini
  25. 25. Habilite a extensão PHP no ZendServer CE
  26. 26. Verifique se o módulo foi habilitado: phpinfo()
  27. 27. Documentação antiga • A partir da versão 1.3.0 do driver, Derick Rethans mudou o nome da classe de Mongo para MongoClient • Mais detalhes no post institulado “Mongo is dead, long live MongoClient”:http://derickrethans.nl/mong oclient.html
  28. 28. phpMoAdmin 1. Acesse: http://www.phpmoadmin.com/ 2. Faça o download do phpmoadmin.zip, descomprima e copie o script moadmin.php para a raiz do Apache – coloque uma autenticação (caso deseje)
  29. 29. Anatomia do código PHP <?php $conexao = new MongoClient(); $db = $conexao->nomebase; $clientes = array( 'nome' => "Ari Stopassola Junior", 'endereco'=> "Estrada do Carazal, 3744", 'cidade' => "Gramado" ); $colecao = $db->clientes; $colecao->insert($clientes); $elementos = $colecao->find( array('cidade' => 'Gramado')); foreach ($elementos as $obj) { echo $obj['endereco']."<br>"; } ?>
  30. 30. Conexão //Conecta em localhost:27017 $conexao = new MongoClient(); //Conecta no host remoto na porta default $conexao = new MongoClient("200.248.240.62"); //Host remoto na porta especificada $conexao = new MongoClient("exemplo.com:65432"); $conexao = new MongoClient("localhost:27017", array("username" => "root", "password" => "senha"));
  31. 31. Conexão (mais elegante) try { $conexao = new MongoClient(); } catch (MongoConnectionException $e){ die($e->getMessage()); }
  32. 32. Base de dados $db = $conexao->nomebase; //Formato alternativo $db = $conexao->selectDB('nomebase'); ATENÇÃO: se a base não existir, ela será criada, portanto certifique-se bem do nome da base.
  33. 33. Coleção //Faz referência a coleção $colecao = $db->clientes; //Formato direto, partindo da conexão $colecao = $conexao->nomebase->clientes; //Formato alternativo $colecao = $db->selectCollection('clientes');
  34. 34. Inserção Documento == Array PHP $clientes = array( 'nome' => "Ari Stopassola Junior", 'endereco'=> "Estrada do Carazal, 3744", 'cidade' => "Gramado", 'UF' => "Rio Grande do Sul", 'CEP' => "95670-000" ); $colecao->insert($clientes);
  35. 35. Inserção: documento dentro de documento $passeio = array( "nome" => "Raízes Coloniais", "valor" => 90, "opcionais” => array("almoco" => true, "transfer" => true), "observacoes" => "Senhor obeso, portanto reserve dois assentos", "data" => new MongoDate() ); db.passeios.insert({ "nome": "Itaimbezinho", "valor": 120, "opcionais": [ { "almoco": false, "transfer": true, "observacoes": "Vai a família toda" } ], "observacoes": "já foi pago", "data": new Date() }) Sob o ponto de vista relacional, não seria possível inserir um array no campo “opcionais”. Seria necessário uma nova tabela (provavelmente até uma terceira tabela, dependendo do nível de normalização) para que isso fosse viável – sendo imprescindível o uso de JOINS
  36. 36. Dot notation db.voucher.find({ 'pacotes.passeios.nome': "Tour Uva e Vinho”})
  37. 37. batchInsert $anuncios[] = array( 'nome' => 'iPod', 'modelo' => 'Touch', 'capacidade' => '16Gb', ); $anuncios[] = array( 'nome' => 'Airport Express', 'specs' => array('AirPlay', 'dual band') ); $anuncios[] = array( 'nome' => 'iBook', 'modelo' => 'Clamshell', 'CPU' => 'G3 366 Mhz', 'specs' => array('Airport', 'fonte YoYo') ); $colecao->batchInsert($anuncios);
  38. 38. Consulta //Busca TODOS $elementos = $colecao->find(); foreach ($elementos as $objeto) { echo $objeto['endereco']."n"; } //Filtra por alguma característica $elementos = $colecao->find(array('cidade' => 'Gramado'));
  39. 39. find versus findone findone retorna um objeto do tipo MongoId print_r($resultado); http://php.net/manual/pt_BR/class.mongoid.php find retorna um objeto do tipo MongoCursor requer iteração foreach($resultado as $item) { print_r($item); } http://php.net/manual/pt_BR/class.mongocursor.php
  40. 40. ObjectId (equivalente a PK) • Cada documento (registro) recebe um código único e imutável, chamado ObjectId • Esse identificador baseia-se no momento em que a inserção foi realizada, em conjunto com o nome do host, concatenado ao PID (process ID) do >s edbrv.pidaosrs eei ousm.f ninúdm()e[r0o] aleatório > db.passeios.find()[0]._id > db.passeios.find()[0]._id.getTimestamp() ISODate("2013-06-07T20:07:26Z")
  41. 41. ObjectID ✓ $id = new MongoId('54526904b7f83ac71d0041a7'); $resultado = $colecao->findone(array('_id' => $id)); print_r($resultado); ✗ $id = '54526904b7f83ac71d0041a7'; $resultado = $colecao->findone(array('_id' => $id)); print_r($resultado);
  42. 42. Como referenciar um ObjectId > new ObjectId ObjectId("51b278e1fc431ab4f7484cd7") Atenção: ObjectId é um objeto e não uma string Como trabalhar esse ID numa URL? Ex.: www.site.com.br/conteudo.php?id=51b278e1fc431ab4f748 4cd7 ou (via mod_rewrite)
  43. 43. Uso do $ nos operadores ✓ ✗ $c->find(array('dist' => array('$lt' => 40))); $c->find(array("dist" => array("$lt" => 40))); Para mudar esse comportamento, edite a seguinte cláusula no php.mongo.cmd = ":" $c->find(array("dist" => array(":lt" => 40)));
  44. 44. Segurança: SQL Injection • SQL – todas as operações (select, delete, drop etc) são passadas ao banco de dados como string, através do método query – SQL aceita múltiplos comandos na mesma requisição, delimitado por ponto-e-vírgula • mongoDB – cada operação tem um método distinto
  45. 45. • Cenário: Request Injection – http://url/script.php?usuario=ari $c->find(array("usr" => $_GET['usuario'])); • Ataque: – http://url/script.php?usuario[$ne]=ninja – PHP converte automaticamente essa string num array: $c->find(array("usr" => array('$ne'=>'ninja'))); • Resultado: busca todos os usuário exceto o ninja (decorrente do operador $ne – not equal) • Contra-medida – faça casting para string através de serialize, http_build_query, implode etc.
  46. 46. Persistência de Objeto <?php $conexao= new MongoClient(); $db = $conexao->agencia; $passeio = new stdClass(); $passeio->nome = 'Tour Nova Petropolis'; $passeio->valor = 140; $colecao = $db->passeios; $colecao->insert($passeio); $conexao = null; ?>
  47. 47. class Clientes{ public $nome; public $trocas; public function __construct($n, array $trocas){ $this->nome = $n; $this->trocas = $trocas; } } class Imoveis{ public $nome; public $endereco; public $reservado; public function __construct($n, $e){ $this->nome = $n; $this->endereco = $e; $this->reservado = true; } } class Trocas{ public $dia; public $imovel; public function __construct(DateTime $d, Imoveis $i){ $this->dia = $d; $this->imovel = $i; } }
  48. 48. $imovel1 = new Imoveis("Cabana Carazal", "Estrada carazal, 3744"); $trocas[] = new Trocas(new DateTime, $imovel1); $imovel2 = new Imoveis("Apto Vale do Bosque", "Condomínio vale"); $trocas[] = new Trocas(new DateTime, $imovel2); $cliente = new Clientes("Ana Zago", $trocas); $colecao->insert($cliente);
  49. 49. Paginação $elementos = $c->find()->limit(2); $elementos = $c->find()->skip(3); //1 é ascendente e -1 descendente $elementos = $c->find()->sort(array("nome" => 1)); $elementos = $c->find()->sort(array("cidade" => -1)); //Operações pré e pós consulta $elementos = $c->find(); $elementos->sort(array("cidade" => -1, "nome" => 1));
  50. 50. Paginação: encadeando $e = $c->find()->limit(2)->skip(1)->sort(array('nome'=>-1)); foreach($e as $item){ print_r($item); }
  51. 51. What’s happening? • Não criamos a base de dados • Não utilizamos as cláusulas SQL: CREATE TABLE, auto_increment, PRIMARY KEY, INDEX etc • Não utilizamos ALTER TABLE para adicionar novos campos • Não foi necessário aplicar JOINS entre entidades • Nada de PDO, ORM ou bibliotecas externas
  52. 52. Teorema de Brewer • Em 2000 Eric Brewer definiu a equação CAP • Só pode escolher DUAS (das três • Consistência: clientes disponíveis) enxergam os dados de forma idêntica • Disponibilidade: toda operação tem uma resposta • Partição: sistema continua operante mesmo enfrentado particionamento Fonte: http://dbpedias.com/wiki/NoSQL:Consistency_Models_in_Non-Relational_Databases
  53. 53. mongoDB é fully consistent • Realiza operações atômicas no documento • Por natureza, dados são agrupados em um único documento • No entanto é suficiente e atende aos requisitos ACID • Base relacional requer transações (para garantir ACID) pois representa os dados em diferentes tabelas
  54. 54. Fire and forget it ACID x BASE • Inserção assíncrona – comportamento padrão: $colecao->insert($clientes); –Não bloqueia o script enquanto a instrução não tenha sido efetivada –Melhora a performance da aplicação (não a do banco) • Inserção síncrona (modelo tradicional): $colecao->insert($clientes, array('safe'=>true)); – Aceito em insert, update, remove e save
  55. 55. Update • Dois métodos – Substituição (de tudo) – Modificação (somente daquilo que se deseja)
  56. 56. ATENÇÃO: update por substituição de array PHP pelo documento inteiro Use '$push'
  57. 57. Update in place • Operador $set é atômico e mais eficiente, portanto evite a $colecao->update( array( '_id' => new MongoId('4fb69113550a6bdd02000000') ), array( '$set' => array( 'UF' => 'Pernambuco', 'CEP' => '50710-090')) ); Operador $set muda ou adiciona elementos $colecao->update( array( '_id' => new MongoId('4fb69113550a6bdd02000000') ), array( array( 'UF' => 'Pernambuco' , 'CEP' => '50710-090')) ); Sobrescreve TODO o documento Diferente de (string)” 4fb69113550a6bdd02000000” ✓ ✗ abordagem de manipular o array via PHP • Primeiro parâmetro é o critério – nesse caso o ID do documento
  58. 58. update – adicionando campos aninhados $colecao->update( array( '_id' => new MongoId('4fb69113550a6bdd02000000') ), array( '$set' => array( 'proximo' => array( 'Banco Itaú', 'Carrefour', 'PanVel', 'Marista') ) ) );
  59. 59. Adicionando (append) $colecao->update( array( '_id' => new MongoId('4fb69113550a6bdd02000000') ), array( '$push'=> array( 'proximo' => 'Academia de ginastica')) );
  60. 60. Método save • save é um wrapper para os métodos insert e update • Se passar um objeto _id ele edita o registro através do update • Caso não passe, ele insere como um novo documento através do método insert
  61. 61. save (agindo como update) $anuncio = array( 'nome' => 'MacBook', 'modelo' => 'Pro', 'tela' => '13"', 'tela_tipo' => 'retina', 'memoria' => '8Gb', 'HD' => '128Gb SSD', 'assessorios' => array('Fonte MagSafe original') ); $colecao->save($anuncio); //Cria e gera _id 54526904b7f83ac71d0041a7 $anuncio = array( '_id' => new MongoId('54526904b7f83ac71d0041a7'), 'nome' => 'MacBook', 'modelo' => 'Pro', 'tela' => '13"', 'tela_tipo' => 'retina', 'CPU' => "2.5 GHz Intel Core i5", 'memoria' => '8Gb', 'HD' => '500Gb Sata', 'specs' => array('bateria 8h', 'iSigh', 'thunderbolt'), 'assessorios' => array('Fonte MagSafe original') ); $colecao->save($anuncio); //Sobrescreve
  62. 62. Excluíndo $colecao->remove(array ('_id' => new MongoId('545280bab7f83ac71d0041a9') )); $passeios->remove(array("nome" => "Uva e Vinho"), array("justOne" => true)); http://php.net/manual/pt_BR/mongocollection.remove.php
  63. 63. Trabalhando com arrays: $in, $nin e $all $cursor = $colecao->find( array('assessorios' => array('$in' => array('caixa original') ) ) ); foreach($cursor as $doc){ print_r($doc); }
  64. 64. ATENÇÃO: excluíndo sem critério $colecao->remove(); $colecao->drop();
  65. 65. Índices $criterio = array('num' => array('$gt' => 50000, '$lt' => 500002)); print_r($c->find($criterio)->explain());
  66. 66. Índices: adicionando $c->ensureindex(array('num' => 1));
  67. 67. Operadores de comparação Operador Significado $gt Greater than (maior que) $gte Greater than equal (maior igual) $in In (existe em) $lt Less then (menor que) $lte Less then equal (menor igual) $ne Not equal (diferente) $nin Not in (não existe em) db.passeios.find({distancia: {$gte:100}})
  68. 68. Operadores de avaliação: Expressões Regulares $where = array('nome' => array( '$regex' => new MongoRegex("/ari/i"))); $cursor = $colecao->find($where); foreach($cursor as $item){ print_r($item); } Flag Significado i case insensitive m multiline x can contain comments l locale s dotall, "." matches everything, including newlines u match unicode
  69. 69. Projeção Especifica quais campos serão retornados. Sintaxe: find({critério},{projeção}) $projecao = array( "_id" => false, "nome" => true, "passeio" => true); $where = array('nome'=> array('$regex' => new MongoRegex("/ari/i"))); $cursor = $colecao->find($where, $projecao); foreach($cursor as $item){ print_r($item); }
  70. 70. ALERTA: (Projeção) $proj = array( "_id" => false, "nome" => true, "passeio" => true, "rg" => false, "datahora" => false); Fatal error: Uncaught exception 'MongoCursorException' with message 'servidor:27017: Can't canonicalize query: BadValue Projection cannot have a mix of inclusion and exclusion.'… O único campo que permite omitir é o _id ✗
  71. 71. Tenho como hospedar? 1 2 3
  72. 72. Ferramentas de administração http://docs.mongodb.org/ecosystem/tools/administration-interfaces/ • Fang of Mongo https://github.com/Fiedzia/Fang-of- Mongo • Umongo http://edgytech.com/umongo/ • MongoHub http://mongohub.todayclose.com/ • RockMongo • Genghis • Mongobird • RoboMongo • MongoVUE http://www.mongovue.com • Opricot https://github.com/argon/Opricot- MongoConsole • MongoVision https://code.google.com/p/mong o-vision/ mongoOWL http://mongoowl.citsoft.ne t
  73. 73. Vasta bibliografia…
  74. 74. Programa de certificação • C100DBA MongoDB Certified DBA Associate Exam • C100DEV MongoDB Certified Developer Associate Exam • 90 minutos de duração • US$ 150 • UMA "recuperação" gratuita, caso reprove
  75. 75. Referências • http://nosql-database.org/ • http://www.php.net/manual/en/mongo.tutor ial.php • https://mongolab.com • Learning MongoDB – Tuts+ http://code.tutsplus.com/courses/learning-mongodb • Curso da Infinite Skills com Doug Bierer http://www.infiniteskills.com/training/learnin g-mongodb.html
  76. 76. Contatos E-mail: arijunior@gmail.com Twitter: @stopassola Skype: stopassola LinkedIn: http://pt.linkedin.com/in/stopassola Facebook: http://www.facebook.com/arijunior Sites: http://www.perito.inf.br http://www.rumoacertificacaophp.co m

×