Desenvolvimento de aplicações PHP com MongoDB

79
Apresentação: Ari Stopassola Junior @stopassola

description

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.

Transcript of Desenvolvimento de aplicações PHP com MongoDB

Page 1: Desenvolvimento de aplicações PHP com MongoDB

Apresentaccedilatildeo

Ari Stopassola Junior

stopassola

Bacharel em Informaacutetica com ecircnfase em Anaacutelise de

Sistemas pela Unisinos cursou mestrado em Engenharia

Informaacutetica e de Computadores pelo Instituto Superior

Teacutecnico da Universidade Teacutecnica de Lisboa (Portugal)

perito judicial ad hoc especializado em TI (mantenedor do

site PERITOinfbr) Zend Certified Engineer (PHP 53) e

Zend Certified PHP Engineer (PHP 55) ZEND004019

Certified ScrumMaster pela Scrum Alliance 203613

Microsoft Certified Professional (MCP) consultor web e PHP

evangelist

Ari Stopassola Junior

Roadmap

bull Conceito de bases de dados NoSQL

bull cases

bull comparaccedilotildees com o modelo relacional

bull expressotildees SQL x MongoDB (orientado agravedocumentos)

bull instalaccedilatildeo

bull recursos do MongoDB

bull operaccedilotildees via console

bull modelagem (embedded)

bull driver PHP

bull anatomia do coacutedigo PHP

bull CRUD (Create Read Update and Delete)

bull ObjectId

bull operadores

bull seguranccedila

bull persistecircncia de objetos

bull tratamento arrays (documentos aninhados)

bull iacutendices (performance)

bull projeccedilatildeo

bull hospedagem

bull ferramentas de administraccedilatildeo

bull programa de certificaccedilatildeo

NoSQL

bull Not Only SQL (poderia ser NOSQL)

bull Movimento de bancos de dados natildeo

relacionais

bull Tambeacutem chamados Modelo Relacional

Natildeo Normalizado (MRNN)

bull Seria mais apropriado dizer entatildeo ldquoNo

relationalrdquo pois alguns SGBDs possuem

interface SQL embora sejam

categorizados como NoSQL Ex

OrientDB

Taxonomia das bases NoSQLbull Documento (XML ou JSON)

ndash RavenDB CouchDB MongoDB

bull Orientado a Objetosndash Db4o

bull ChaveValor (KeyValue)ndash Redis SimpleDB Hbase MemcacheDB Riak Berkeley DB

bull Tabular (inspirado no BigTable do Google)ndash Cassandra (Apache) Hypertable Hbase

bull Orientado a colunas (relacionais com caracteriacutesticasNoSQL)ndash Vertica MonetDB LucidDB Infobright

bull Grafos (Graph)ndash Neo4j OrientDB Titan DEX InfiniteGraph InfoGrid

HyperGraphDB

bull Outrosndash Chordless Mnesia Fonte httpptwikipediaorgwikiNoSQL

Quem usa NoSQL

bull eBay (pioneiro)

bull New York Times

bull Foursquare

bull Electronic Arts

bull GitHub

bull SAP

bull Disney

bull Twitter

ldquoFifteen months ago It took two weeks to perform ALTER TABLE on the statuses [tweets] tablerdquo (setembro2010)

Fonte httpwwwmongodborgaboutproduction-deployments

Abordagens

ACID

bull Atomic

bull Consistent

bull Isolated

bull Durable

bull Integridade

bull Consistecircncia

bull Conservador

BASE

bull Basic Availability

bull Soft-state

bull Eventual consistency

bull Toleracircncia

bull Disponibilidade

bull AgressivoFonte httpwwwcsberkeleyedu~brewercs262b-2004PODC-keynotepdf

bull Responsaacutevel por 438 casamentos ao dia nos

EUA

bull Algoritmo ldquoCompatibility Matching Systemrdquo

reduz significativamente o nuacutemero de

separaccedilotildees

bull +51 milhotildees de usuaacuterios

bull Processa 1 bilhatildeo de combinaccedilotildees de casais

bull Sob RDBMS demorava 2 semanas

processando

bull MongoDB leva 12 horas (95 a menos)

Fontehttpwwwmongodbcompressmongodb-powers-critical-eharmony-compatibility-application-processing-1-billion-matches-dail-0httpwwwmongodbcompresentationsbig-dating-eharmony

Base orientada a documentos

Fonte livro ldquoMongoDB and PHPrdquo de Steve Francia publicado pela OrsquoReilly

Por quecirc

bull Sistemas Orientados agrave Objetos

requer ORM (Object-Relational

Mapping)

bull Normalizaccedilatildeo precisa de JOINs

bull Complexidade dos relacionamentos

bull Problemas ao escalar

vertical versus horizontal

Sharding escalabilidade

Horizontalmente escalaacutevel

A

LT

W

Iacutendice ldquoCrdquo

A

LT

W

F

Y

U

P

K

S

V

Z

Replica set redundacircncia

Diagrama ER do

cataacutelogo de produtos

do Magento

Modelagem relacional

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 2: Desenvolvimento de aplicações PHP com MongoDB

Bacharel em Informaacutetica com ecircnfase em Anaacutelise de

Sistemas pela Unisinos cursou mestrado em Engenharia

Informaacutetica e de Computadores pelo Instituto Superior

Teacutecnico da Universidade Teacutecnica de Lisboa (Portugal)

perito judicial ad hoc especializado em TI (mantenedor do

site PERITOinfbr) Zend Certified Engineer (PHP 53) e

Zend Certified PHP Engineer (PHP 55) ZEND004019

Certified ScrumMaster pela Scrum Alliance 203613

Microsoft Certified Professional (MCP) consultor web e PHP

evangelist

Ari Stopassola Junior

Roadmap

bull Conceito de bases de dados NoSQL

bull cases

bull comparaccedilotildees com o modelo relacional

bull expressotildees SQL x MongoDB (orientado agravedocumentos)

bull instalaccedilatildeo

bull recursos do MongoDB

bull operaccedilotildees via console

bull modelagem (embedded)

bull driver PHP

bull anatomia do coacutedigo PHP

bull CRUD (Create Read Update and Delete)

bull ObjectId

bull operadores

bull seguranccedila

bull persistecircncia de objetos

bull tratamento arrays (documentos aninhados)

bull iacutendices (performance)

bull projeccedilatildeo

bull hospedagem

bull ferramentas de administraccedilatildeo

bull programa de certificaccedilatildeo

NoSQL

bull Not Only SQL (poderia ser NOSQL)

bull Movimento de bancos de dados natildeo

relacionais

bull Tambeacutem chamados Modelo Relacional

Natildeo Normalizado (MRNN)

bull Seria mais apropriado dizer entatildeo ldquoNo

relationalrdquo pois alguns SGBDs possuem

interface SQL embora sejam

categorizados como NoSQL Ex

OrientDB

Taxonomia das bases NoSQLbull Documento (XML ou JSON)

ndash RavenDB CouchDB MongoDB

bull Orientado a Objetosndash Db4o

bull ChaveValor (KeyValue)ndash Redis SimpleDB Hbase MemcacheDB Riak Berkeley DB

bull Tabular (inspirado no BigTable do Google)ndash Cassandra (Apache) Hypertable Hbase

bull Orientado a colunas (relacionais com caracteriacutesticasNoSQL)ndash Vertica MonetDB LucidDB Infobright

bull Grafos (Graph)ndash Neo4j OrientDB Titan DEX InfiniteGraph InfoGrid

HyperGraphDB

bull Outrosndash Chordless Mnesia Fonte httpptwikipediaorgwikiNoSQL

Quem usa NoSQL

bull eBay (pioneiro)

bull New York Times

bull Foursquare

bull Electronic Arts

bull GitHub

bull SAP

bull Disney

bull Twitter

ldquoFifteen months ago It took two weeks to perform ALTER TABLE on the statuses [tweets] tablerdquo (setembro2010)

Fonte httpwwwmongodborgaboutproduction-deployments

Abordagens

ACID

bull Atomic

bull Consistent

bull Isolated

bull Durable

bull Integridade

bull Consistecircncia

bull Conservador

BASE

bull Basic Availability

bull Soft-state

bull Eventual consistency

bull Toleracircncia

bull Disponibilidade

bull AgressivoFonte httpwwwcsberkeleyedu~brewercs262b-2004PODC-keynotepdf

bull Responsaacutevel por 438 casamentos ao dia nos

EUA

bull Algoritmo ldquoCompatibility Matching Systemrdquo

reduz significativamente o nuacutemero de

separaccedilotildees

bull +51 milhotildees de usuaacuterios

bull Processa 1 bilhatildeo de combinaccedilotildees de casais

bull Sob RDBMS demorava 2 semanas

processando

bull MongoDB leva 12 horas (95 a menos)

Fontehttpwwwmongodbcompressmongodb-powers-critical-eharmony-compatibility-application-processing-1-billion-matches-dail-0httpwwwmongodbcompresentationsbig-dating-eharmony

Base orientada a documentos

Fonte livro ldquoMongoDB and PHPrdquo de Steve Francia publicado pela OrsquoReilly

Por quecirc

bull Sistemas Orientados agrave Objetos

requer ORM (Object-Relational

Mapping)

bull Normalizaccedilatildeo precisa de JOINs

bull Complexidade dos relacionamentos

bull Problemas ao escalar

vertical versus horizontal

Sharding escalabilidade

Horizontalmente escalaacutevel

A

LT

W

Iacutendice ldquoCrdquo

A

LT

W

F

Y

U

P

K

S

V

Z

Replica set redundacircncia

Diagrama ER do

cataacutelogo de produtos

do Magento

Modelagem relacional

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 3: Desenvolvimento de aplicações PHP com MongoDB

Roadmap

bull Conceito de bases de dados NoSQL

bull cases

bull comparaccedilotildees com o modelo relacional

bull expressotildees SQL x MongoDB (orientado agravedocumentos)

bull instalaccedilatildeo

bull recursos do MongoDB

bull operaccedilotildees via console

bull modelagem (embedded)

bull driver PHP

bull anatomia do coacutedigo PHP

bull CRUD (Create Read Update and Delete)

bull ObjectId

bull operadores

bull seguranccedila

bull persistecircncia de objetos

bull tratamento arrays (documentos aninhados)

bull iacutendices (performance)

bull projeccedilatildeo

bull hospedagem

bull ferramentas de administraccedilatildeo

bull programa de certificaccedilatildeo

NoSQL

bull Not Only SQL (poderia ser NOSQL)

bull Movimento de bancos de dados natildeo

relacionais

bull Tambeacutem chamados Modelo Relacional

Natildeo Normalizado (MRNN)

bull Seria mais apropriado dizer entatildeo ldquoNo

relationalrdquo pois alguns SGBDs possuem

interface SQL embora sejam

categorizados como NoSQL Ex

OrientDB

Taxonomia das bases NoSQLbull Documento (XML ou JSON)

ndash RavenDB CouchDB MongoDB

bull Orientado a Objetosndash Db4o

bull ChaveValor (KeyValue)ndash Redis SimpleDB Hbase MemcacheDB Riak Berkeley DB

bull Tabular (inspirado no BigTable do Google)ndash Cassandra (Apache) Hypertable Hbase

bull Orientado a colunas (relacionais com caracteriacutesticasNoSQL)ndash Vertica MonetDB LucidDB Infobright

bull Grafos (Graph)ndash Neo4j OrientDB Titan DEX InfiniteGraph InfoGrid

HyperGraphDB

bull Outrosndash Chordless Mnesia Fonte httpptwikipediaorgwikiNoSQL

Quem usa NoSQL

bull eBay (pioneiro)

bull New York Times

bull Foursquare

bull Electronic Arts

bull GitHub

bull SAP

bull Disney

bull Twitter

ldquoFifteen months ago It took two weeks to perform ALTER TABLE on the statuses [tweets] tablerdquo (setembro2010)

Fonte httpwwwmongodborgaboutproduction-deployments

Abordagens

ACID

bull Atomic

bull Consistent

bull Isolated

bull Durable

bull Integridade

bull Consistecircncia

bull Conservador

BASE

bull Basic Availability

bull Soft-state

bull Eventual consistency

bull Toleracircncia

bull Disponibilidade

bull AgressivoFonte httpwwwcsberkeleyedu~brewercs262b-2004PODC-keynotepdf

bull Responsaacutevel por 438 casamentos ao dia nos

EUA

bull Algoritmo ldquoCompatibility Matching Systemrdquo

reduz significativamente o nuacutemero de

separaccedilotildees

bull +51 milhotildees de usuaacuterios

bull Processa 1 bilhatildeo de combinaccedilotildees de casais

bull Sob RDBMS demorava 2 semanas

processando

bull MongoDB leva 12 horas (95 a menos)

Fontehttpwwwmongodbcompressmongodb-powers-critical-eharmony-compatibility-application-processing-1-billion-matches-dail-0httpwwwmongodbcompresentationsbig-dating-eharmony

Base orientada a documentos

Fonte livro ldquoMongoDB and PHPrdquo de Steve Francia publicado pela OrsquoReilly

Por quecirc

bull Sistemas Orientados agrave Objetos

requer ORM (Object-Relational

Mapping)

bull Normalizaccedilatildeo precisa de JOINs

bull Complexidade dos relacionamentos

bull Problemas ao escalar

vertical versus horizontal

Sharding escalabilidade

Horizontalmente escalaacutevel

A

LT

W

Iacutendice ldquoCrdquo

A

LT

W

F

Y

U

P

K

S

V

Z

Replica set redundacircncia

Diagrama ER do

cataacutelogo de produtos

do Magento

Modelagem relacional

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 4: Desenvolvimento de aplicações PHP com MongoDB

NoSQL

bull Not Only SQL (poderia ser NOSQL)

bull Movimento de bancos de dados natildeo

relacionais

bull Tambeacutem chamados Modelo Relacional

Natildeo Normalizado (MRNN)

bull Seria mais apropriado dizer entatildeo ldquoNo

relationalrdquo pois alguns SGBDs possuem

interface SQL embora sejam

categorizados como NoSQL Ex

OrientDB

Taxonomia das bases NoSQLbull Documento (XML ou JSON)

ndash RavenDB CouchDB MongoDB

bull Orientado a Objetosndash Db4o

bull ChaveValor (KeyValue)ndash Redis SimpleDB Hbase MemcacheDB Riak Berkeley DB

bull Tabular (inspirado no BigTable do Google)ndash Cassandra (Apache) Hypertable Hbase

bull Orientado a colunas (relacionais com caracteriacutesticasNoSQL)ndash Vertica MonetDB LucidDB Infobright

bull Grafos (Graph)ndash Neo4j OrientDB Titan DEX InfiniteGraph InfoGrid

HyperGraphDB

bull Outrosndash Chordless Mnesia Fonte httpptwikipediaorgwikiNoSQL

Quem usa NoSQL

bull eBay (pioneiro)

bull New York Times

bull Foursquare

bull Electronic Arts

bull GitHub

bull SAP

bull Disney

bull Twitter

ldquoFifteen months ago It took two weeks to perform ALTER TABLE on the statuses [tweets] tablerdquo (setembro2010)

Fonte httpwwwmongodborgaboutproduction-deployments

Abordagens

ACID

bull Atomic

bull Consistent

bull Isolated

bull Durable

bull Integridade

bull Consistecircncia

bull Conservador

BASE

bull Basic Availability

bull Soft-state

bull Eventual consistency

bull Toleracircncia

bull Disponibilidade

bull AgressivoFonte httpwwwcsberkeleyedu~brewercs262b-2004PODC-keynotepdf

bull Responsaacutevel por 438 casamentos ao dia nos

EUA

bull Algoritmo ldquoCompatibility Matching Systemrdquo

reduz significativamente o nuacutemero de

separaccedilotildees

bull +51 milhotildees de usuaacuterios

bull Processa 1 bilhatildeo de combinaccedilotildees de casais

bull Sob RDBMS demorava 2 semanas

processando

bull MongoDB leva 12 horas (95 a menos)

Fontehttpwwwmongodbcompressmongodb-powers-critical-eharmony-compatibility-application-processing-1-billion-matches-dail-0httpwwwmongodbcompresentationsbig-dating-eharmony

Base orientada a documentos

Fonte livro ldquoMongoDB and PHPrdquo de Steve Francia publicado pela OrsquoReilly

Por quecirc

bull Sistemas Orientados agrave Objetos

requer ORM (Object-Relational

Mapping)

bull Normalizaccedilatildeo precisa de JOINs

bull Complexidade dos relacionamentos

bull Problemas ao escalar

vertical versus horizontal

Sharding escalabilidade

Horizontalmente escalaacutevel

A

LT

W

Iacutendice ldquoCrdquo

A

LT

W

F

Y

U

P

K

S

V

Z

Replica set redundacircncia

Diagrama ER do

cataacutelogo de produtos

do Magento

Modelagem relacional

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 5: Desenvolvimento de aplicações PHP com MongoDB

Taxonomia das bases NoSQLbull Documento (XML ou JSON)

ndash RavenDB CouchDB MongoDB

bull Orientado a Objetosndash Db4o

bull ChaveValor (KeyValue)ndash Redis SimpleDB Hbase MemcacheDB Riak Berkeley DB

bull Tabular (inspirado no BigTable do Google)ndash Cassandra (Apache) Hypertable Hbase

bull Orientado a colunas (relacionais com caracteriacutesticasNoSQL)ndash Vertica MonetDB LucidDB Infobright

bull Grafos (Graph)ndash Neo4j OrientDB Titan DEX InfiniteGraph InfoGrid

HyperGraphDB

bull Outrosndash Chordless Mnesia Fonte httpptwikipediaorgwikiNoSQL

Quem usa NoSQL

bull eBay (pioneiro)

bull New York Times

bull Foursquare

bull Electronic Arts

bull GitHub

bull SAP

bull Disney

bull Twitter

ldquoFifteen months ago It took two weeks to perform ALTER TABLE on the statuses [tweets] tablerdquo (setembro2010)

Fonte httpwwwmongodborgaboutproduction-deployments

Abordagens

ACID

bull Atomic

bull Consistent

bull Isolated

bull Durable

bull Integridade

bull Consistecircncia

bull Conservador

BASE

bull Basic Availability

bull Soft-state

bull Eventual consistency

bull Toleracircncia

bull Disponibilidade

bull AgressivoFonte httpwwwcsberkeleyedu~brewercs262b-2004PODC-keynotepdf

bull Responsaacutevel por 438 casamentos ao dia nos

EUA

bull Algoritmo ldquoCompatibility Matching Systemrdquo

reduz significativamente o nuacutemero de

separaccedilotildees

bull +51 milhotildees de usuaacuterios

bull Processa 1 bilhatildeo de combinaccedilotildees de casais

bull Sob RDBMS demorava 2 semanas

processando

bull MongoDB leva 12 horas (95 a menos)

Fontehttpwwwmongodbcompressmongodb-powers-critical-eharmony-compatibility-application-processing-1-billion-matches-dail-0httpwwwmongodbcompresentationsbig-dating-eharmony

Base orientada a documentos

Fonte livro ldquoMongoDB and PHPrdquo de Steve Francia publicado pela OrsquoReilly

Por quecirc

bull Sistemas Orientados agrave Objetos

requer ORM (Object-Relational

Mapping)

bull Normalizaccedilatildeo precisa de JOINs

bull Complexidade dos relacionamentos

bull Problemas ao escalar

vertical versus horizontal

Sharding escalabilidade

Horizontalmente escalaacutevel

A

LT

W

Iacutendice ldquoCrdquo

A

LT

W

F

Y

U

P

K

S

V

Z

Replica set redundacircncia

Diagrama ER do

cataacutelogo de produtos

do Magento

Modelagem relacional

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 6: Desenvolvimento de aplicações PHP com MongoDB

Quem usa NoSQL

bull eBay (pioneiro)

bull New York Times

bull Foursquare

bull Electronic Arts

bull GitHub

bull SAP

bull Disney

bull Twitter

ldquoFifteen months ago It took two weeks to perform ALTER TABLE on the statuses [tweets] tablerdquo (setembro2010)

Fonte httpwwwmongodborgaboutproduction-deployments

Abordagens

ACID

bull Atomic

bull Consistent

bull Isolated

bull Durable

bull Integridade

bull Consistecircncia

bull Conservador

BASE

bull Basic Availability

bull Soft-state

bull Eventual consistency

bull Toleracircncia

bull Disponibilidade

bull AgressivoFonte httpwwwcsberkeleyedu~brewercs262b-2004PODC-keynotepdf

bull Responsaacutevel por 438 casamentos ao dia nos

EUA

bull Algoritmo ldquoCompatibility Matching Systemrdquo

reduz significativamente o nuacutemero de

separaccedilotildees

bull +51 milhotildees de usuaacuterios

bull Processa 1 bilhatildeo de combinaccedilotildees de casais

bull Sob RDBMS demorava 2 semanas

processando

bull MongoDB leva 12 horas (95 a menos)

Fontehttpwwwmongodbcompressmongodb-powers-critical-eharmony-compatibility-application-processing-1-billion-matches-dail-0httpwwwmongodbcompresentationsbig-dating-eharmony

Base orientada a documentos

Fonte livro ldquoMongoDB and PHPrdquo de Steve Francia publicado pela OrsquoReilly

Por quecirc

bull Sistemas Orientados agrave Objetos

requer ORM (Object-Relational

Mapping)

bull Normalizaccedilatildeo precisa de JOINs

bull Complexidade dos relacionamentos

bull Problemas ao escalar

vertical versus horizontal

Sharding escalabilidade

Horizontalmente escalaacutevel

A

LT

W

Iacutendice ldquoCrdquo

A

LT

W

F

Y

U

P

K

S

V

Z

Replica set redundacircncia

Diagrama ER do

cataacutelogo de produtos

do Magento

Modelagem relacional

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 7: Desenvolvimento de aplicações PHP com MongoDB

Abordagens

ACID

bull Atomic

bull Consistent

bull Isolated

bull Durable

bull Integridade

bull Consistecircncia

bull Conservador

BASE

bull Basic Availability

bull Soft-state

bull Eventual consistency

bull Toleracircncia

bull Disponibilidade

bull AgressivoFonte httpwwwcsberkeleyedu~brewercs262b-2004PODC-keynotepdf

bull Responsaacutevel por 438 casamentos ao dia nos

EUA

bull Algoritmo ldquoCompatibility Matching Systemrdquo

reduz significativamente o nuacutemero de

separaccedilotildees

bull +51 milhotildees de usuaacuterios

bull Processa 1 bilhatildeo de combinaccedilotildees de casais

bull Sob RDBMS demorava 2 semanas

processando

bull MongoDB leva 12 horas (95 a menos)

Fontehttpwwwmongodbcompressmongodb-powers-critical-eharmony-compatibility-application-processing-1-billion-matches-dail-0httpwwwmongodbcompresentationsbig-dating-eharmony

Base orientada a documentos

Fonte livro ldquoMongoDB and PHPrdquo de Steve Francia publicado pela OrsquoReilly

Por quecirc

bull Sistemas Orientados agrave Objetos

requer ORM (Object-Relational

Mapping)

bull Normalizaccedilatildeo precisa de JOINs

bull Complexidade dos relacionamentos

bull Problemas ao escalar

vertical versus horizontal

Sharding escalabilidade

Horizontalmente escalaacutevel

A

LT

W

Iacutendice ldquoCrdquo

A

LT

W

F

Y

U

P

K

S

V

Z

Replica set redundacircncia

Diagrama ER do

cataacutelogo de produtos

do Magento

Modelagem relacional

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 8: Desenvolvimento de aplicações PHP com MongoDB

bull Responsaacutevel por 438 casamentos ao dia nos

EUA

bull Algoritmo ldquoCompatibility Matching Systemrdquo

reduz significativamente o nuacutemero de

separaccedilotildees

bull +51 milhotildees de usuaacuterios

bull Processa 1 bilhatildeo de combinaccedilotildees de casais

bull Sob RDBMS demorava 2 semanas

processando

bull MongoDB leva 12 horas (95 a menos)

Fontehttpwwwmongodbcompressmongodb-powers-critical-eharmony-compatibility-application-processing-1-billion-matches-dail-0httpwwwmongodbcompresentationsbig-dating-eharmony

Base orientada a documentos

Fonte livro ldquoMongoDB and PHPrdquo de Steve Francia publicado pela OrsquoReilly

Por quecirc

bull Sistemas Orientados agrave Objetos

requer ORM (Object-Relational

Mapping)

bull Normalizaccedilatildeo precisa de JOINs

bull Complexidade dos relacionamentos

bull Problemas ao escalar

vertical versus horizontal

Sharding escalabilidade

Horizontalmente escalaacutevel

A

LT

W

Iacutendice ldquoCrdquo

A

LT

W

F

Y

U

P

K

S

V

Z

Replica set redundacircncia

Diagrama ER do

cataacutelogo de produtos

do Magento

Modelagem relacional

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 9: Desenvolvimento de aplicações PHP com MongoDB

Base orientada a documentos

Fonte livro ldquoMongoDB and PHPrdquo de Steve Francia publicado pela OrsquoReilly

Por quecirc

bull Sistemas Orientados agrave Objetos

requer ORM (Object-Relational

Mapping)

bull Normalizaccedilatildeo precisa de JOINs

bull Complexidade dos relacionamentos

bull Problemas ao escalar

vertical versus horizontal

Sharding escalabilidade

Horizontalmente escalaacutevel

A

LT

W

Iacutendice ldquoCrdquo

A

LT

W

F

Y

U

P

K

S

V

Z

Replica set redundacircncia

Diagrama ER do

cataacutelogo de produtos

do Magento

Modelagem relacional

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 10: Desenvolvimento de aplicações PHP com MongoDB

Por quecirc

bull Sistemas Orientados agrave Objetos

requer ORM (Object-Relational

Mapping)

bull Normalizaccedilatildeo precisa de JOINs

bull Complexidade dos relacionamentos

bull Problemas ao escalar

vertical versus horizontal

Sharding escalabilidade

Horizontalmente escalaacutevel

A

LT

W

Iacutendice ldquoCrdquo

A

LT

W

F

Y

U

P

K

S

V

Z

Replica set redundacircncia

Diagrama ER do

cataacutelogo de produtos

do Magento

Modelagem relacional

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 11: Desenvolvimento de aplicações PHP com MongoDB

Sharding escalabilidade

Horizontalmente escalaacutevel

A

LT

W

Iacutendice ldquoCrdquo

A

LT

W

F

Y

U

P

K

S

V

Z

Replica set redundacircncia

Diagrama ER do

cataacutelogo de produtos

do Magento

Modelagem relacional

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 12: Desenvolvimento de aplicações PHP com MongoDB

Replica set redundacircncia

Diagrama ER do

cataacutelogo de produtos

do Magento

Modelagem relacional

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 13: Desenvolvimento de aplicações PHP com MongoDB

Diagrama ER do

cataacutelogo de produtos

do Magento

Modelagem relacional

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 14: Desenvolvimento de aplicações PHP com MongoDB

Modelagem relacional

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 15: Desenvolvimento de aplicações PHP com MongoDB

Modelagem

Orientada a

Documentos

Organizaccedilatildeointerna

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 16: Desenvolvimento de aplicações PHP com MongoDB

AMP

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 17: Desenvolvimento de aplicações PHP com MongoDB

MongoDBhttpwwwmongodborg

bull Nome vem da expressatildeo huMONGOus

que significa ldquoextremamente enormerdquo

bull Banco de dados open source

httpsgithubcommongodb

bull Criado pela 10gen em C++ orientado a

documentos (formato JSONBSON)

bull Escalaacutevel

bull Schemaless (natildeo haacute colunas ou tipos de

dados)

JavaScript Object Notation

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 18: Desenvolvimento de aplicações PHP com MongoDB

Expressotildees SQL em

MongoDBSQL MongoDB

Database Database

Table Collection

Index Index

Row Document

Column Field

Joining Embedding amp linking

Partition Shard

Fonte ldquoReference Cards for MongoDBrdquo

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 19: Desenvolvimento de aplicações PHP com MongoDB

Hierarquia

bull Bancos de dados armazenam coleccedilotildees

bull Coleccedilotildees possuem documentos

bull No contexto PHP documentos satildeo arrays

multidimensionais

bull Do ponto de vista do MongoDB satildeo

estruturas em JSON Imagem extraiacuteda de httphabrahabrrupost156633

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 20: Desenvolvimento de aplicações PHP com MongoDB

Ready sethellip

GO

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 21: Desenvolvimento de aplicações PHP com MongoDB

Instalaccedilatildeo manual OSX e Linux1) Baixe o binaacuterio do MongoDB em httpwwwmongodborgdownloads

Descompacte o arquivo mongodb-osx-x86_64-2xxtgz

2) Renomeie o diretoacuterio (resultado da descompactaccedilatildeo) para um nome maisapropriada Ex mongodb

3) Abra o terminal e adicione ao final do arquivo etcpaths o caminho

sudo vim etcpaths

Adicione a linha (de acordo com o diretoacuterio onde o MongoDB se encontra)Ex Usersarimongodbbin

echo export PATH=$PATHUsersarimongodbbin gt ~bash_profile

4) Crie diretoacuterios para armazenar as bases O binaacuterio disponibilizado pela

10gen prevecirc que a base ficaraacute na raiz do sistema operacionalsudo mkdir -p datadb

sudo chown `id -u` datadb

5) Inicie o serviccedilo (deamon)mongod amp

6) Abra a console do MongoDB e realize um testemongo

gt dbpasseiossave( a 1 )

gt dbpasseiosfind()

sudo mongod amp (dependendo das permissotildees de usuaacuterio)

Meacutetodo alternativo ao passo 3

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 22: Desenvolvimento de aplicações PHP com MongoDB

Instalaccedilatildeo Windows

bull Download (certifique-se da arquitetura 32 ou64bit)

bull Descomprimir no Cmongodb-win32-i386-2xx

bull Renomear a pasta para Cmongodb

bull Abra o terminal como usuaacuterio Administrador

bull Crie o diretoacuterio cdatadb

cd

md data

md datadb

bull Execute o deamon do MongoDBcmongodbbinmongodexe

bull Em outra console execute o clientcmongodbbinmongoexe

Fonte httpdocsmongodborgmanualtutorialinstall-mongodb-on-windows

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 23: Desenvolvimento de aplicações PHP com MongoDB

Driver para PHPhttpsgithubcommongodbmongo-php-driver

bull Mantido por Derick Rethans (autor do

xDebug e vaacuterios outros projetos

significativos)

httpderickrethansnl

bull httpdocsmongodborgecosystemdriversp

hp

Foto httpstevemaraspinnetphotogalleryconferences2012-phpday-verona-italy

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 24: Desenvolvimento de aplicações PHP com MongoDB

Instalaccedilatildeo do driver PHP para mongoDBhttppeclphpnetpackagemongo

sudo pecl install mongo

Adicione a linha extension=mongoso no phpini

htt

p

so

up

fort

heg

irly

sou

lblo

gsp

ot

com

br

20

12

03

su

nd

ay-s

mile

s-o

pti

mis

m-o

pp

ort

un

ists

-an

dh

tml

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 25: Desenvolvimento de aplicações PHP com MongoDB

Habilite a extensatildeo PHP no

ZendServer CE

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 26: Desenvolvimento de aplicações PHP com MongoDB

Verifique se o moacutedulo foihabilitado phpinfo()

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 27: Desenvolvimento de aplicações PHP com MongoDB

Documentaccedilatildeo antiga

bull A partir da versatildeo 130 do driver Derick

Rethans mudou o nome da classe de

Mongo para MongoClient

bull Mais detalhes no post institulado

ldquoMongo is dead long live

MongoClientrdquohttpderickrethansnlmong

oclienthtml

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 28: Desenvolvimento de aplicações PHP com MongoDB

phpMoAdmin1 Acesse

httpwwwphpmoadmincom

2 Faccedila o download do phpmoadminzip

descomprima e copie o script moadminphp para a raiz do Apache ndash

coloque uma autenticaccedilatildeo (caso deseje)

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 29: Desenvolvimento de aplicações PHP com MongoDB

Anatomia do coacutedigo PHPltphp

$conexao = new MongoClient()

$db = $conexao-gtnomebase

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

)

$colecao = $db-gtclientes

$colecao-gtinsert($clientes)

$elementos = $colecao-gtfind( array(cidade =gt Gramado))

foreach ($elementos as $obj)

echo $obj[endereco]ltbrgt

gt

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 30: Desenvolvimento de aplicações PHP com MongoDB

Conexatildeo

Conecta em localhost27017

$conexao = new MongoClient()

Conecta no host remoto na porta default

$conexao = new MongoClient(20024824062)

Host remoto na porta especificada

$conexao = new MongoClient(exemplocom65432)

$conexao = new MongoClient(localhost27017

array(username =gt root password =gt

senha))

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 31: Desenvolvimento de aplicações PHP com MongoDB

Conexatildeo (mais elegante)

try

$conexao = new MongoClient()

catch (MongoConnectionException $e)

die($e-gtgetMessage())

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 32: Desenvolvimento de aplicações PHP com MongoDB

Base de dados

$db = $conexao-gtnomebase

Formato alternativo

$db = $conexao-gtselectDB(nomebase)

ATENCcedilAtildeO se a base natildeo existir ela seraacute

criada portanto certifique-se bem do nome da

base

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 33: Desenvolvimento de aplicações PHP com MongoDB

Coleccedilatildeo

Faz referecircncia a coleccedilatildeo

$colecao = $db-gtclientes

Formato direto partindo da conexatildeo

$colecao = $conexao-gtnomebase-gtclientes

Formato alternativo

$colecao = $db-gtselectCollection(clientes)

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 34: Desenvolvimento de aplicações PHP com MongoDB

Inserccedilatildeo

Documento == Array PHP

$clientes = array(

nome =gt Ari Stopassola Junior

endereco=gt Estrada do Carazal 3744

cidade =gt Gramado

UF =gt Rio Grande do Sul

CEP =gt 95670-000

)

$colecao-gtinsert($clientes)

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 35: Desenvolvimento de aplicações PHP com MongoDB

Inserccedilatildeo documento dentro de

documento$passeio = array(

nome =gt Raiacutezes Coloniais

valor =gt 90

opcionaisrdquo =gt array(almoco =gt true transfer =gt true)

observacoes =gt Senhor obeso portanto reserve dois assentos

data =gt new MongoDate()

)

dbpasseiosinsert(

nome Itaimbezinho

valor 120

opcionais [

almoco false

transfer true

observacoes Vai a famiacutelia toda

]

observacoes jaacute foi pago

data new Date()

)

Sob o ponto de vista relacional natildeo seria possiacutevel inserir um array no campo ldquoopcionaisrdquo Seria necessaacuterio uma nova

tabela (provavelmente ateacute uma terceira tabela dependendo do niacutevel de normalizaccedilatildeo) para que

isso fosse viaacutevel ndash sendo imprescindiacutevel o uso de JOINS

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 36: Desenvolvimento de aplicações PHP com MongoDB

Dot notationdbvoucherfind(

pacotespasseiosnome Tour Uva e Vinhordquo)

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 37: Desenvolvimento de aplicações PHP com MongoDB

batchInsert$anuncios[] = array(

nome =gt iPod

modelo =gt Touch

capacidade =gt 16Gb

)

$anuncios[] = array(

nome =gt Airport Express

specs =gt array(AirPlay dual band)

)

$anuncios[] = array(

nome =gt iBook

modelo =gt Clamshell

CPU =gt G3 366 Mhz

specs =gt array(Airport fonte YoYo)

)

$colecao-gtbatchInsert($anuncios)

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 38: Desenvolvimento de aplicações PHP com MongoDB

Consulta

Busca TODOS

$elementos = $colecao-gtfind()

foreach ($elementos as $objeto)

echo $objeto[endereco]n

Filtra por alguma caracteriacutestica

$elementos = $colecao-gtfind(array(cidade =gt Gramado))

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 39: Desenvolvimento de aplicações PHP com MongoDB

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)

httpphpnetmanualpt_BRclassmongoidphp

httpphpnetmanualpt_BRclassmongocursorphp

requer iteraccedilatildeo

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 40: Desenvolvimento de aplicações PHP com MongoDB

ObjectId

(equivalente a PK)

bull Cada documento (registro) recebe um

coacutedigo uacutenico e imutaacutevel chamado

ObjectId

bull Esse identificador baseia-se no momento

em que a inserccedilatildeo foi realizada em

conjunto com o nome do host

concatenado ao PID (process ID) do

servidor e um nuacutemero aleatoacuteriogt dbpasseiosfind()[0]

gt dbpasseiosfind()[0]_id

gt dbpasseiosfind()[0]_idgetTimestamp()

ISODate(2013-06-07T200726Z)

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 41: Desenvolvimento de aplicações PHP com MongoDB

ObjectID

$id = new MongoId(54526904b7f83ac71d0041a7)

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

$id = 54526904b7f83ac71d0041a7

$resultado = $colecao-gtfindone(array(_id =gt $id))

print_r($resultado)

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 42: Desenvolvimento de aplicações PHP com MongoDB

Como referenciar um ObjectId

gt new ObjectId

ObjectId(51b278e1fc431ab4f7484cd7)

Atenccedilatildeo ObjectId eacute um objeto e natildeo uma

string

Como trabalhar esse ID numa URL Ex

wwwsitecombrconteudophpid=51b278e1fc431ab4f748

4cd7

ou (via mod_rewrite)

wwwsitecombrconteudo51b278e1fc431ab4f7484cd7

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 43: Desenvolvimento de aplicações PHP com MongoDB

Uso do $ nos operadores

$c-gtfind(array(dist =gt array($lt =gt 40)))

$c-gtfind(array(dist =gt array($lt =gt 40)))

Para mudar esse comportamento edite a seguinte claacuteusula no phpinimongocmd =

$c-gtfind(array(dist =gt array(lt =gt 40)))

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 44: Desenvolvimento de aplicações PHP com MongoDB

Seguranccedila SQL Injection

bull SQL

ndash todas as operaccedilotildees (select delete drop

etc) satildeo passadas ao banco de dados comostring atraveacutes do meacutetodo query

ndash SQL aceita muacuteltiplos comandos na mesma

requisiccedilatildeo delimitado por ponto-e-viacutergula

bull mongoDB

ndash cada operaccedilatildeo tem um meacutetodo distinto

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 45: Desenvolvimento de aplicações PHP com MongoDB

bull Cenaacuterio

ndash httpurlscriptphpusuario=ari$c-gtfind(array(usr =gt $_GET[usuario]))

bull Ataque

ndash httpurlscriptphpusuario[$ne]=ninja

ndash PHP converte automaticamente essa string num array$c-gtfind(array(usr =gt array($ne=gtninja)))

bull Resultado busca todos os usuaacuterio exceto o ninja (decorrente do operador $ne ndash not equal)

bull Contra-medidandash faccedila casting para string atraveacutes de serialize http_build_query implode etc

Request Injection

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 46: Desenvolvimento de aplicações PHP com MongoDB

Persistecircncia de Objetoltphp

$conexao= new MongoClient()

$db = $conexao-gtagencia

$passeio = new stdClass()

$passeio-gtnome = Tour Nova Petropolis

$passeio-gtvalor = 140

$colecao = $db-gtpasseios

$colecao-gtinsert($passeio)

$conexao = null

gt

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 47: Desenvolvimento de aplicações PHP com MongoDB

class Clientes

public $nome

public $trocas

public function __construct($n array $trocas)

$this-gtnome = $n

$this-gttrocas = $trocas

class Imoveis

public $nome

public $endereco

public $reservado

public function __construct($n $e)

$this-gtnome = $n

$this-gtendereco = $e

$this-gtreservado = true

class Trocas

public $dia

public $imovel

public function __construct(DateTime $d Imoveis $i)

$this-gtdia = $d

$this-gtimovel = $i

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 48: Desenvolvimento de aplicações PHP com MongoDB

$imovel1 = new Imoveis(Cabana Carazal Estrada carazal 3744)

$trocas[] = new Trocas(new DateTime $imovel1)

$imovel2 = new Imoveis(Apto Vale do Bosque Condomiacutenio vale)

$trocas[] = new Trocas(new DateTime $imovel2)

$cliente = new Clientes(Ana Zago $trocas)

$colecao-gtinsert($cliente)

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 49: Desenvolvimento de aplicações PHP com MongoDB

Paginaccedilatildeo

$elementos = $c-gtfind()-gtlimit(2)

$elementos = $c-gtfind()-gtskip(3)

1 eacute ascendente e -1 descendente

$elementos = $c-gtfind()-gtsort(array(nome =gt 1))

$elementos = $c-gtfind()-gtsort(array(cidade =gt -1))

Operaccedilotildees preacute e poacutes consulta

$elementos = $c-gtfind()

$elementos-gtsort(array(cidade =gt -1 nome =gt 1))

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 50: Desenvolvimento de aplicações PHP com MongoDB

Paginaccedilatildeo encadeando

$e = $c-gtfind()-gtlimit(2)-gtskip(1)-gtsort(array(nome=gt-1))

foreach($e as $item)

print_r($item)

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 51: Desenvolvimento de aplicações PHP com MongoDB

Whatrsquos happening

bull Natildeo criamos a base de dados

bull Natildeo utilizamos as claacuteusulas SQL CREATE

TABLE auto_increment PRIMARY

KEY INDEX etc

bull Natildeo utilizamos ALTER TABLE para

adicionar novos campos

bull Natildeo foi necessaacuterio aplicar JOINS entre

entidades

bull Nada de PDO ORM ou bibliotecas externas

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 52: Desenvolvimento de aplicações PHP com MongoDB

Teorema de Brewer

bull Em 2000 Eric Brewer definiu a equaccedilatildeo

CAP

bull Soacute pode escolher DUAS (das trecircs

disponiacuteveis)

Fonte httpdbpediascomwikiNoSQLConsistency_Models_in_Non-Relational_Databases

bull Consistecircncia clientes enxergam os dados de forma idecircntica

bull Disponibilidade toda operaccedilatildeo tem uma resposta

bull Particcedilatildeo sistema continua operante mesmo enfrentado particionamento

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 53: Desenvolvimento de aplicações PHP com MongoDB

mongoDB eacute fully consistent

bull Realiza operaccedilotildees atocircmicas no documento

bull Por natureza dados satildeo agrupados emum uacutenico documento

bull No entanto eacute suficiente e atende aosrequisitos ACID

bull Base relacional requer transaccedilotildees (paragarantir ACID) pois representa os dados em diferentes tabelas

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 54: Desenvolvimento de aplicações PHP com MongoDB

Fire and forget it

ACID x BASE

bull Inserccedilatildeo assiacutencrona ndash comportamentopadratildeo$colecao-gtinsert($clientes)

ndash Natildeo bloqueia o script enquanto a instruccedilatildeonatildeo tenha sido efetivada

ndash Melhora a performance da aplicaccedilatildeo (natildeoa do banco)

bull Inserccedilatildeo siacutencrona (modelo tradicional)$colecao-gtinsert($clientes

array(safe=gttrue))

ndash Aceito em insert update remove e save

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 55: Desenvolvimento de aplicações PHP com MongoDB

Update

bull Dois meacutetodos

ndash Substituiccedilatildeo (de tudo)

ndash Modificaccedilatildeo (somente daquilo que se deseja)

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 56: Desenvolvimento de aplicações PHP com MongoDB

ATENCcedilAtildeO update por substituiccedilatildeo

de array PHP pelo documento inteiro

Use $push

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 57: Desenvolvimento de aplicações PHP com MongoDB

Update in place

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( UF =gt Pernambuco CEP =gt 50710-090))

)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( array( UF =gt Pernambuco CEP =gt 50710-090))

)

Sobrescreve TODO o documento

Operador $set mudaou adiciona elementos

Diferente de (string)rdquo 4fb69113550a6bdd02000000rdquo

bull Operador $set eacute atocircmico e mais eficiente portanto evite a abordagem de manipular o array via PHP

bull Primeiro paracircmetro eacute o criteacuterio ndash nesse caso o ID do documento

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 58: Desenvolvimento de aplicações PHP com MongoDB

update ndash adicionando campos

aninhados

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $set =gt array( proximo =gt

array( Banco Itauacute Carrefour PanVel Marista)

)

)

)

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 59: Desenvolvimento de aplicações PHP com MongoDB

Adicionando (append)

$colecao-gtupdate(

array( _id =gt new MongoId(4fb69113550a6bdd02000000) )

array( $push=gt array( proximo =gt Academia de ginastica))

)

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 60: Desenvolvimento de aplicações PHP com MongoDB

Meacutetodo save

bull save eacute um wrapper para os meacutetodos

insert e update

bull Se passar um objeto _id ele edita o

registro atraveacutes do update

bull Caso natildeo passe ele insere como um

novo documento atraveacutes do meacutetodoinsert

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 61: Desenvolvimento de aplicações PHP com MongoDB

save (agindo como update)$anuncio = array(

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

memoria =gt 8Gb

HD =gt 128Gb SSD

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Cria e gera _id 54526904b7f83ac71d0041a7

$anuncio = array(

_id =gt new MongoId(54526904b7f83ac71d0041a7)

nome =gt MacBook

modelo =gt Pro

tela =gt 13

tela_tipo =gt retina

CPU =gt 25 GHz Intel Core i5

memoria =gt 8Gb

HD =gt 500Gb Sata

specs =gt array(bateria 8h iSigh thunderbolt)

assessorios =gt array(Fonte MagSafe original)

)

$colecao-gtsave($anuncio) Sobrescreve

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 62: Desenvolvimento de aplicações PHP com MongoDB

Excluiacutendo

$colecao-gtremove(array

(_id =gt new MongoId(545280bab7f83ac71d0041a9)

))

$passeios-gtremove(array(nome =gt Uva e Vinho)

array(justOne =gt true))

httpphpnetmanualpt_BRmongocollectionremovephp

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 63: Desenvolvimento de aplicações PHP com MongoDB

Trabalhando com arrays $in

$nin e $all

$cursor = $colecao-gtfind(

array(assessorios =gt

array($in =gt

array(caixa original)

)

)

)

foreach($cursor as $doc)

print_r($doc)

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 64: Desenvolvimento de aplicações PHP com MongoDB

ATENCcedilAtildeO excluiacutendo sem criteacuterio

$colecao-gtremove()

$colecao-gtdrop()

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 65: Desenvolvimento de aplicações PHP com MongoDB

Iacutendices

$criterio = array(num =gt array($gt =gt 50000 $lt =gt

500002))

print_r($c-gtfind($criterio)-gtexplain())

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 66: Desenvolvimento de aplicações PHP com MongoDB

Iacutendices adicionando

$c-gtensureindex(array(num =gt 1))

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 67: Desenvolvimento de aplicações PHP com MongoDB

Operadores de comparaccedilatildeo

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 (natildeo existe em)

dbpasseiosfind(distancia $gte100)

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 68: Desenvolvimento de aplicações PHP com MongoDB

Operadores de avaliaccedilatildeo

Expressotildees Regulares

$where = array(nome =gt array(

$regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($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

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 69: Desenvolvimento de aplicações PHP com MongoDB

Projeccedilatildeo

Especifica quais campos seratildeo retornados Sintaxe

find(criteacuterioprojeccedilatildeo)

$projecao = array( _id =gt false

nome =gt true

passeio =gt true)

$where = array(nome=gt

array($regex =gt new MongoRegex(arii)))

$cursor = $colecao-gtfind($where $projecao)

foreach($cursor as $item)

print_r($item)

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 70: Desenvolvimento de aplicações PHP com MongoDB

ALERTA (Projeccedilatildeo)

$proj = array( _id =gt false

nome =gt true

passeio =gt true

rg =gt false

datahora =gt false)

Fatal error Uncaught exception MongoCursorException with message servidor27017 Cant canonicalizequery BadValue Projection cannot have a mix of inclusion and exclusionhellip

O uacutenico campo que permite omitir eacute o _id

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 71: Desenvolvimento de aplicações PHP com MongoDB

Tenho como hospedar1

2

3

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 72: Desenvolvimento de aplicações PHP com MongoDB

Ferramentas de administraccedilatildeohttpdocsmongodborgecosystemtoolsadministration-

interfaces

bull Fang of Mongo

httpsgithubcomFiedziaFang-

of-Mongo

bull Umongo

httpedgytechcomumongo

bull MongoHub

httpmongohubtodayclosecom

bull RockMongo

bull Genghis

bull Mongobird

bull RoboMongo

bull MongoVUE

httpwwwmongovuecom

bull Opricot

httpsgithubcomargonOpricot-

MongoConsole

bull MongoVision

httpscodegooglecompmong

o-vision

mongoOWLhttpmongoowlcitsoftne

t

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 73: Desenvolvimento de aplicações PHP com MongoDB

Vasta bibliografiahellip

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 74: Desenvolvimento de aplicações PHP com MongoDB

Programa de certificaccedilatildeo

bull C100DBA

MongoDB Certified DBA Associate Exam

bull C100DEV

MongoDB Certified Developer Associate

Exam

bull 90 minutos de duraccedilatildeo

bull US$ 150

bull UMA recuperaccedilatildeo gratuita caso reprove

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 75: Desenvolvimento de aplicações PHP com MongoDB

Referecircncias

bull httpnosql-databaseorg

bull httpwwwphpnetmanualenmongotutorialphp

bull httpsmongolabcom

bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb

bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos

Page 76: Desenvolvimento de aplicações PHP com MongoDB

E-mail

arijuniorgmailcom

Twitter stopassola

Skype stopassola

LinkedIn

httpptlinkedincominstopassola

Facebook

httpwwwfacebookcomarijunior

Sites

httpwwwperitoinfbr

httpwwwrumoacertificacaophpco

m

Contatos