Download - MongoDB + PHP

Transcript
Page 1: MongoDB + PHP

Apresentação:

Ari Stopassola Junior@stopassola

Page 2: MongoDB + PHP

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), idealizador do projeto Certificamp, consultor web e PHP evangelist.

Ari Stopassola Junior

Page 3: MongoDB + PHP

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,

manual e DBRef• 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 (PaaS)• novidades da versão 3• ferramentas de

administração• programa de certificação

Page 4: MongoDB + PHP
Page 5: MongoDB + PHP

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

Page 6: MongoDB + PHP

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

Page 7: MongoDB + PHP

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/

Page 8: MongoDB + PHP

• 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• MongoDB leva 12 horas (95% a menos)

Fonte:http://www.mongodb.com/press/mongodb-powers-critical-eharmony-compatibility-application-processing-1-billion-matches-dail-0http://www.mongodb.com/presentations/big-dating-eharmony

Page 9: MongoDB + PHP

Base orientada a documentos

Fonte: livro “MongoDB and PHP” de Steve Francia publicado pela O’Reilly

Page 10: MongoDB + PHP

Por quê?

• Sistemas Orientados à Objetos requer ORM (Object-Relational Mapping)

• Normalização precisa de JOINs• Complexidade dos relacionamentos• Problemas ao escalar:

vertical versus horizontal

Page 11: MongoDB + PHP

Sharding: escalabilidade

Horizontalmente escalável

A

LT

W

Índice “C”

A

LT

W

F

Y

U

P

K

S

V

Z

Page 12: MongoDB + PHP

Replica set: redundância

Page 13: MongoDB + PHP

Diagrama ER do catálogo de produtos do

Magento

Page 14: MongoDB + PHP

Modelagem relacional

Page 15: MongoDB + PHP

Modelagem Orientada a Documentos

Organização interna

Page 16: MongoDB + PHP

AMP

Page 17: MongoDB + PHP

MongoDBhttp://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• Schemaless (não há colunas ou tipos

de dados)

JavaScript Object Notation

Page 18: MongoDB + PHP
Page 19: MongoDB + PHP
Page 20: MongoDB + PHP

Expressões SQL em MongoDB

SQL MongoDBDatabase DatabaseTable CollectionIndex IndexRow DocumentColumn FieldJoining Embedding & linkingPartition Shard

Fonte: “Reference Cards for MongoDB”

Page 21: MongoDB + PHP

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

Page 22: MongoDB + PHP

Ready, set…GO!

Page 23: MongoDB + PHP

Instalação manual: OSX e Linux1) Baixe o binário do MongoDB em http://www.mongodb.org/

downloadsDescompacte 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/pathsAdicione 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 &

6) Abra a console do MongoDB e realize um teste:mongo> db.passeios.save( { a : 1 } )> db.passeios.find()

sudo ./mongod & (dependendo das permissões de usuário)

Método alternativo ao passo 3

Page 24: MongoDB + PHP

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:\data\db

cd ..\..md datamd data\db

• Execute o deamon do MongoDB:c:\mongodb\bin\mongod.exe

• Em outra console execute o client:c:\mongodb\bin\mongo.exe

Fonte: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/

Page 26: MongoDB + PHP

Instalação do driver PHP para mongoDBhttp://pecl.php.net/package/mongo

# sudo pecl install mongoAdicione a linha extension=mongo.so no php.ini

http:

//so

upfo

rthe

girly

soul

.blo

gspo

t.com

.br/

2012

/03/

sund

ay-s

mile

s-op

timis

m-o

ppor

tuni

sts-

and.

htm

l

Page 27: MongoDB + PHP

Habilite a extensão PHP no ZendServer CE

Page 28: MongoDB + PHP

Verifique se o módulo foi habilitado: phpinfo()

Page 29: MongoDB + PHP

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/mongoclient.html

Page 30: MongoDB + PHP

phpMoAdmin1. 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)

Page 31: MongoDB + PHP

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>";

}?>

Page 32: MongoDB + PHP

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"));

Page 33: MongoDB + PHP

Conexão (mais elegante)

try {$conexao = new MongoClient();}

catch (MongoConnectionException $e){die($e->getMessage());

}

Page 34: MongoDB + PHP

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.

Page 35: MongoDB + PHP

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');

Page 36: MongoDB + PHP

InserçãoDocumento == 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);

Page 37: MongoDB + PHP

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

Page 38: MongoDB + PHP
Page 39: MongoDB + PHP

Dot notationdb.voucher.find({

'pacotes.passeios.nome': "Tour Uva e Vinho”})

Page 40: MongoDB + PHP

What’s happening?!

• Não criamos a base de dados• Não utilizamos cláusulas SQL como : 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

Page 41: MongoDB + PHP

Modelagem

Page 42: MongoDB + PHP

• Quando a entidade tornar-se muito grande, pode-se quebrá-la em mais coleções

• Mantém o ObjectID como referência• Esse link deve ser criado

manualmente

Relação "UM para UM"(abordagem manual)

Page 43: MongoDB + PHP

Relação "UM para UM" manual(definição de classes)

<?phpclass Servico{

public $_id;public $nome;public $datahora;public function __construct($i, $n, DateTime $d){

$this->_id = $i;$this->nome = $n;$this->datahora = $d;

}}class NotaFiscal{

public $servico_id;const emitente = "Empresa Ltda";public $danfe;public $valor;public function __construct($s_id, $d, $v){

$this->servico_id= $s_id;$this->danfe = $d;$this->valor = $v;

}}

Page 44: MongoDB + PHP

Faço o encadeamento manualmente

$conexao = new MongoClient(); //Conecta no mongoDB$db = $conexao->turismo; //Escolhe a base de dados$servicos = $db->servicos; //Escolhe a coleção$notasfiscais = $db->notasfiscais; //Escolhe a coleção

//Gero um ObjectID, para que eu possa fazer o encadeamento depois$serv[] = new Servico(new MongoID(), "Tour Uva e Vinho", new DateTime);$serv[] = new Servico(new MongoID(), "Itaimbezinho", new DateTime);$servicos->batchInsert($serv);

//O ObjectID será criado implicitamente$nf[] = new NotaFiscal($serv[0]->_id->__toString(), "12.34", 89); $nf[] = new NotaFiscal($serv[1]->_id->__toString(), "56.78", 152.50);$notasfiscais->batchInsert($nf);

//Localiza um servico$servico = $servicos->findOne(array('nome' => 'Itaimbezinho'));$notafiscal = $notasfiscais->findOne(array('servico_id' => $servico['_id']->__toString()));

Page 45: MongoDB + PHP

DBRefs: Data Base References

• Convenção para representar um documento de outra coleção

• Forma mais elegante de relacionar coleções

• A abordagem manual funciona bem com dois ou três documentos vinculados. Caso necessite associar múltiplas coleções, considere usar DBRef

• Alerta: nem toda linguagem suporta esse recurso (PHP possui!)

Page 46: MongoDB + PHP

<?phpclass EmpresaParceira{

public $_id;public $nome;public $endereco;public function __construct($i, $n, $e){

$this->_id = $i;$this->nome = $n;$this->endereco = $e;

}}

class Colaborador{public $nome;public $empresa;public function __construct($n, $e){

$this->nome = $n;$this->empresa = $e;

}}

Relação "UM para UM" em DBRefDefinição de classes

Page 47: MongoDB + PHP

Referenciando//Gero um ObjectID, para que eu possa referenciar depois$empr[] = new EmpresaParceira(new MongoID(), "AEREA", "Dom Pedro II, 90");$empr[] = new EmpresaParceira(new MongoID(), "VillaBella", "Av. VillaBella");$empresas->batchInsert($empr);

//Exemplo via console (JavaScript)//var id = new ObjectId('548b3f4bb7f83aa35a0041a8'); //id do VillaBella//db.colaboradores.insert({nome: 'Diego Rossi', empresa: {'$ref':'empresas', '$id':id, '$db':'turismo'}});

//O ObjectID será criado implicitamente$colab[]= new Colaborador("Cleyton Arghiropol", MongoDBRef::create("empresas", $empr[0]->_id, "turismo")); $colab[]= new Colaborador("Paloma Santiago", MongoDBRef::create("empresas", $empr[1]->_id, "turismo"));$colaboradores->batchInsert($colab);

$colaborador = $colaboradores->findOne(array('nome' => 'Paloma Santiago'));print_r($colaborador);

$ref (Coleção)$id (ObjectID)

$db (Banco de dados opcional)

Page 48: MongoDB + PHP

Consultando: método getDBRef

//Localiza um colaborador e obtém a empresa parceira, através de DBRef$colaborador = $colaboradores->findOne(array('nome' => 'Paloma Santiago'));$empresa = $colaboradores->getDBRef($colaborador['empresa']);

Page 49: MongoDB + PHP

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);

Page 50: MongoDB + PHP

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'));

Page 51: MongoDB + PHP

find versus findone

findone retorna um objeto do tipo MongoId

print_r($resultado);

find retorna um objeto do tipo MongoCursor

foreach($resultado as $item) {print_r($item);}

http://php.net/manual/pt_BR/class.mongoid.php

http://php.net/manual/pt_BR/class.mongocursor.php

requer iteração

Page 52: MongoDB + PHP

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 servidor e um número aleatório

> db.passeios.find()[0]> db.passeios.find()[0]._id> db.passeios.find()[0]._id.getTimestamp()

ISODate("2013-06-07T20:07:26Z")

Page 53: MongoDB + PHP

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);

Page 54: MongoDB + PHP

Como referenciar um ObjectId

> new ObjectIdObjectId("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=51b278e1fc431ab4f7484cd7

ou (via mod_rewrite)www.site.com.br/conteudo/51b278e1fc431ab4f7484cd7

Page 55: MongoDB + PHP

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.inimongo.cmd = ":"

$c->find(array("dist" => array(":lt" => 40)));

Page 56: MongoDB + PHP

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, delimitados por ponto-e-vírgula

• mongoDB– cada operação tem um método

distinto

Page 57: MongoDB + PHP

• Cenário:– 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 em 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.

Request Injection

Page 58: MongoDB + PHP

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;?>

Page 59: MongoDB + PHP

Não salva atributos private e protected

class Imoveis{public $nome;public $endereco;private $reservado;public function __construct($n, $e){

$this->nome = $n;$this->endereco= $e;$this->reservado = true;

}}

$imoveis[] = new Imoveis("Cabana", "Estrada carazal");$imoveis[] = new Imoveis("Apto", "Condomínio vale");$colecao->insert($imoveis);Fatal error: Uncaught exception 'MongoException' with message

'zero-length keys are not allowed, did you use $ with double quotes?' …

Page 60: MongoDB + PHP

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;

}}

Page 61: MongoDB + PHP

$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);

Page 62: MongoDB + PHP

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));

Page 63: MongoDB + PHP

Paginação: encadeando

$e = $c->find()->limit(2)->skip(1)->sort(array('nome'=>-1));foreach($e as $item){

print_r($item);}

Page 64: MongoDB + PHP

Teorema de Brewer• Em 2000 Eric Brewer definiu a

equação CAP• Só pode escolher DUAS (das três

disponíveis)

Fonte: http://dbpedias.com/wiki/NoSQL:Consistency_Models_in_Non-Relational_Databases

• Consistência: clientes enxergam os dados de forma idêntica

• Disponibilidade: toda operação tem uma resposta

• Partição: sistema continua operante mesmo enfrentado particionamento

Page 65: MongoDB + PHP

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 (Atomicidade, Consistência, Isolamento e Durabilidade)

• Base relacional requer transações (para garantir ACID) pois representa os dados em diferentes tabelas

Page 66: MongoDB + PHP

Fire and forget itACID 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

Page 67: MongoDB + PHP

Update

• Dois formas:–Substituição (de tudo)–Modificação (somente daquilo que

se deseja)

Page 68: MongoDB + PHP

Update in place

$colecao->update(array( '_id' => new MongoId('4fb69113550a6bdd02000000') ),array( '$set' => array( 'UF' => 'Pernambuco', 'CEP' => '50710-

090')));

$colecao->update(array( '_id' => new MongoId('4fb69113550a6bdd02000000') ),array( array( 'UF' => 'Pernambuco' , 'CEP' => '50710-090'))

);Sobrescreve TODO o

documento

Operador $set muda ou adiciona elementos

Diferente de (string)” 4fb69113550a6bdd02000000”

• Operador $set é atômico e mais eficiente, portanto evite a abordagem de manipular o array via PHP

• Primeiro parâmetro é o critério – nesse caso o ID do documento

Page 69: MongoDB + PHP

update – adicionando campos aninhados

$colecao->update(array( '_id' => new MongoId('4fb69113550a6bdd02000000')

),array( '$set' => array( 'proximo' =>

array( 'Banco Itaú', 'Carrefour', 'PanVel', 'Marista')

))

);

Page 70: MongoDB + PHP

Adicionando (append)$colecao->update(

array( '_id' => new MongoId('4fb69113550a6bdd02000000') ),array( '$push'=> array( 'proximo' => 'Academia de

ginastica')));

Page 71: MongoDB + PHP

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

Page 72: MongoDB + PHP

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

Page 73: MongoDB + PHP

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

Page 74: MongoDB + PHP

Trabalhando com arrays: $in, $nin e $all

$cursor = $colecao->find(array('assessorios' =>

array('$in' =>array('caixa

original'))

));

foreach($cursor as $doc){print_r($doc);

}

Page 75: MongoDB + PHP

ATENÇÃO: excluíndo sem critério

$colecao->remove();

$colecao->drop();

Page 76: MongoDB + PHP

Índices$criterio = array('num' => array('$gt' => 50000, '$lt' => 500002));print_r($c->find($criterio)->explain());

Page 77: MongoDB + PHP

Índices: adicionando

$c->ensureindex(array('num' => 1));

Page 78: MongoDB + PHP

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}})

Page 79: MongoDB + PHP

Operadores de avaliação: Expressões Regulares

$like = array('nome' => array('$regex' => new MongoRegex("/ari/i")));

$cursor = $colecao->find($like);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

Page 80: MongoDB + PHP

ProjeçãoEspecifica quais campos serão retornados. Sintaxe:

find({critério},{projeção})

$projecao = array( "_id" => false,"nome"

=> true,

"passeio" => true);

$like = array('nome'=>array('$regex' => new MongoRegex("/ari/i")));$cursor = $colecao->find($like, $projecao);foreach($cursor as $item){

print_r($item);}

Page 81: MongoDB + PHP

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

Page 82: MongoDB + PHP

MongoDB Shell Enhancementshttps://github.com/TylerBrock/mongo-hacker

• Console "anabolizada"• Ordena documentos

por padrão• Faz Highlight e

identações• Funções e comandos

adicionais• Modo verboso, mais

informativo

Page 83: MongoDB + PHP

Novidades da release 3https://www.mongodb.com/mongodb-3.0

• Nova arquitetura de armazenamento: WiredTiger http://www.wiredtiger.com

• Compressão transparente nativa com ganhos de até 80% de espaço em disco

• Melhorias no journaling e concorrência na arquitetura original (MMAPv1). Aumento de performance entre 7-10x

• Ops Manager* reduz em 95% o custo de operação

• Permite mais de 50 membros de replica set espalhados pelo mundo

Page 84: MongoDB + PHP

Tenho como hospedar?1

2

3

Page 85: MongoDB + PHP

PaaS para MongoDB

Provisionamento, escalabilidade, monitoramento, backup/restauração, segurança, upgrades e suporte:• https://mms.mongodb.com• https://www.compose.io• http://mongodirector.com• https://mongolab.com

Page 87: MongoDB + PHP

Vasta bibliografia…

Page 88: MongoDB + PHP

Programa de certificação

• C100DBAMongoDB Certified DBA Associate Exam

• C100DEVMongoDB Certified Developer Associate Exam

• 90 minutos de duração• US$ 150

Page 91: MongoDB + PHP

proud sponsor