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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
$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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
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
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
Referecircncias
bull httpnosql-databaseorg
bull httpwwwphpnetmanualenmongotutorialphp
bull httpsmongolabcom
bull Learning MongoDB ndash Tuts+httpcodetutspluscomcourseslearning-mongodb
bull Curso da Infinite Skills com Doug Biererhttpwwwinfiniteskillscomtraininglearning-mongodbhtml
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos
arijuniorgmailcom
Twitter stopassola
Skype stopassola
httpptlinkedincominstopassola
httpwwwfacebookcomarijunior
Sites
httpwwwperitoinfbr
httpwwwrumoacertificacaophpco
m
Contatos