50
WORKSHOP ::: 1º PHP-DAY MongoDB: alternativa MongoDB: alternativa intuitiva e não- intuitiva e não- relacional ao Mysql relacional ao Mysql Diego Sana

Mongo Db - PHP Day Workshop

Embed Size (px)

DESCRIPTION

A presentation about non-relational databases focussing on mongodb and how to implement a simple blog backend using it with php.

Citation preview

Page 1: Mongo Db - PHP Day Workshop

WORKSHOP ::: 1º PHP-DAY

MongoDB: alternativa MongoDB: alternativa intuitiva e não-relacional ao intuitiva e não-relacional ao

MysqlMysqlDiego Sana

Page 2: Mongo Db - PHP Day Workshop

Sobre mimSobre mim

• Desenvolvedor e empreendedor web há 10 anosDesenvolvedor e empreendedor web há 10 anos

• Graduando em Ciência da Computação na UFESGraduando em Ciência da Computação na UFES– 1999: freemp3.com.br1999: freemp3.com.br– 2000: Central da Música (.com.br)2000: Central da Música (.com.br)

• Premiado pelo iBest em 2001 e 2003Premiado pelo iBest em 2001 e 2003

– 2003: Primeiro contato com PHP2003: Primeiro contato com PHP– 2004: Flogão.com.br (PHP, databases, escalabilidade)2004: Flogão.com.br (PHP, databases, escalabilidade)– 2007: Power.com (idem)2007: Power.com (idem)– 2009: Restarting (bye-bye mysql, thanks for all the fish)2009: Restarting (bye-bye mysql, thanks for all the fish)

• Blog: www.sanainside.com, Twitter: @sanainsideBlog: www.sanainside.com, Twitter: @sanainside

Page 3: Mongo Db - PHP Day Workshop

SumárioSumário

• Bancos de dados relacionais e seus Bancos de dados relacionais e seus problemasproblemas

• Bancos de dados não-relacionais (e o Bancos de dados não-relacionais (e o "movimento" NOSQL)"movimento" NOSQL)

• MongoDB: o que é, quem faz, filosofia, MongoDB: o que é, quem faz, filosofia, funcionalidades, pros, contras,funcionalidades, pros, contras,por que usarpor que usar

• MongoDB: Botando a mão na massaMongoDB: Botando a mão na massa

• MongoDB: indo alémMongoDB: indo além

Page 4: Mongo Db - PHP Day Workshop

MotivaçãoMotivação

• Os bancos de dados relacionais se Os bancos de dados relacionais se tornaram o "martelo" da indústria de tornaram o "martelo" da indústria de armazenamento de dadosarmazenamento de dados

• Facilidade para entender o modelo Facilidade para entender o modelo relacional de dados e consultá-losrelacional de dados e consultá-los

• VersatilidadeVersatilidade

Page 5: Mongo Db - PHP Day Workshop

• Na computação, tudo que é versátil Na computação, tudo que é versátil demais, é menos eficientedemais, é menos eficiente

• Bancos relacionais não "casam" com o Bancos relacionais não "casam" com o paradigma OO. Necessidade de ORMs (“O paradigma OO. Necessidade de ORMs (“O Vietnã da Ciência da Computação“)Vietnã da Ciência da Computação“)

• Concebidos no final da década de 70, Concebidos no final da década de 70, quando não existia a ... WEB!!!quando não existia a ... WEB!!!

Porém…Porém…

Page 6: Mongo Db - PHP Day Workshop

• RDBMS (como o mysql) são usados RDBMS (como o mysql) são usados certamente em 99,9% dos sitescertamente em 99,9% dos sites

• 99,9% dos sites não precisam de boa parte 99,9% dos sites não precisam de boa parte de suas funcionalidades (ACID, triggers, de suas funcionalidades (ACID, triggers, stored procedures quem?)stored procedures quem?)

• Apesar da versatilidade, não são tão flexíveisApesar da versatilidade, não são tão flexíveis

• Pra escalar, só fazendo muita magia e Pra escalar, só fazendo muita magia e rasgando o manual (foda-se normalização, rasgando o manual (foda-se normalização, fodam-se chaves estrangeiras, fodam-se os fodam-se chaves estrangeiras, fodam-se os joins)joins)

RDBMS e a webRDBMS e a web……

Page 7: Mongo Db - PHP Day Workshop

• RDBMS sendo usados de forma não-relacional. RDBMS sendo usados de forma não-relacional. Por que usá-los então?Por que usá-los então?

• Engenheiros de grandes empresas da WEB Engenheiros de grandes empresas da WEB desenvolveram suas próprias databases para desenvolveram suas próprias databases para resolver seus problemas de escalaresolver seus problemas de escala

• Algumas open-source, e as que não são foram Algumas open-source, e as que não são foram "clonadas" por projetos Open-Source"clonadas" por projetos Open-Source

• "Cool Kids" chamam esse "movimento" de "Cool Kids" chamam esse "movimento" de NoSQLNoSQL

Podemos fazer melhor: NoSQLPodemos fazer melhor: NoSQL

Page 8: Mongo Db - PHP Day Workshop

• Usada internamente em vários Usada internamente em vários serviços do Googleserviços do Google

• Escalável, tolerante a falhas eEscalável, tolerante a falhas eorientada colunas/linhas (híbrida)orientada colunas/linhas (híbrida)

• Disponível para uso com Google App Disponível para uso com Google App EngineEngine

• Clones open-source: HBase e HyperTableClones open-source: HBase e HyperTable

Exemplos: BigTableExemplos: BigTable

Page 9: Mongo Db - PHP Day Workshop

• Criada pela Amazon.comCriada pela Amazon.com

• Database chave / valor, alta escalabilidade Database chave / valor, alta escalabilidade / disponibilidade/ disponibilidade

• Disponível para uso via Amazon Web Disponível para uso via Amazon Web Services ("SimpleDB")Services ("SimpleDB")

• Clone Open-source: Project Voldemort Clone Open-source: Project Voldemort (Linkedin)(Linkedin)

Exemplos: DynamoExemplos: Dynamo

Page 10: Mongo Db - PHP Day Workshop

• Projeto Open-Source iniciado Projeto Open-Source iniciado por empresa contratada para por empresa contratada para desenvolver LiveJournal.comdesenvolver LiveJournal.com

• Na verdade um camada de Na verdade um camada de cache chave/valor, alta cache chave/valor, alta escalabilidade/disponibilidadeescalabilidade/disponibilidade

• MemcacheDB = Memcache + BerkeleyDB = MemcacheDB = Memcache + BerkeleyDB = persistência em discopersistência em disco

• Redis = Memcache não-volátil e com mais Redis = Memcache não-volátil e com mais estruturas de dados (strings, listas, conjuntos)estruturas de dados (strings, listas, conjuntos)

Exemplos: MemcacheExemplos: Memcache

Page 11: Mongo Db - PHP Day Workshop

• Apache Foundation. Orientado a Apache Foundation. Orientado a documentos, schema freedocumentos, schema free

• Acesso via REST, documentos JSONAcesso via REST, documentos JSON

• ACIDACID

• Querys precisam ser pré-definidas (criação Querys precisam ser pré-definidas (criação de views)de views)

Exemplos: CouchDBExemplos: CouchDB

Page 12: Mongo Db - PHP Day Workshop

• Escalabilidade facilitadaEscalabilidade facilitada

• Alta-performanceAlta-performance

• Modelos de dados simplificados/limitadosModelos de dados simplificados/limitados

• Quase sempre Quase sempre querys simples, estilo querys simples, estilo "Select * from tabela where ID='xxx'""Select * from tabela where ID='xxx'"

O que todos eles tem em comumO que todos eles tem em comum

Page 13: Mongo Db - PHP Day Workshop

• Um banco de dados Um banco de dados de alta performance,de alta performance,escalável, e escalável, e schema-free schema-free orientado a orientado a documentosdocumentos

• Em uso há quase 2 anos. Beta desde fev/2009. Em uso há quase 2 anos. Beta desde fev/2009. Versão 1.0 GA em agosto/2009Versão 1.0 GA em agosto/2009

• Preenche lacuna entre as databases do tipo Preenche lacuna entre as databases do tipo Chave / Valor (rápidas e escaláveis) e os Chave / Valor (rápidas e escaláveis) e os tradicionais RDBMS (que tem mais tradicionais RDBMS (que tem mais funcionalidades)funcionalidades)

Mongo DB: o melhor dos dois Mongo DB: o melhor dos dois mundosmundos

Page 14: Mongo Db - PHP Day Workshop

• Empresa americana 10gen, mesmo Empresa americana 10gen, mesmo modelo da Mysql ABmodelo da Mysql AB

• Fundadores trouxeram experiência Fundadores trouxeram experiência adquirida na DoubleClickadquirida na DoubleClick

Quem fazQuem faz

Page 15: Mongo Db - PHP Day Workshop

• Databases estão se especializando Databases estão se especializando

• O modelo orientado a documentos éO modelo orientado a documentos éde fácil implementação e de fácil implementação e gerenciamento, proporciona melhor gerenciamento, proporciona melhor performanceperformance

• Redução de capacidades para maior Redução de capacidades para maior performance é importante, mas há performance é importante, mas há necessidade de mais funcionalidades que necessidade de mais funcionalidades que as providas por databases chave/valoras providas por databases chave/valor

FilosofiaFilosofia

Page 16: Mongo Db - PHP Day Workshop

• Querys dinâmicas e mais parecidas com Querys dinâmicas e mais parecidas com SQLSQL

• Suporte a índices, inclusive em vetoresSuporte a índices, inclusive em vetores

• Query profilingQuery profiling

• Operadores $gt, $gte, $lt, $lte, $eq, $neq, Operadores $gt, $gte, $lt, $lte, $eq, $neq, $exists, $set, $mod, $where, $in, $inc, $exists, $set, $mod, $where, $in, $inc, $pull, $push, $pop, $pushAll, $popAll$pull, $push, $pop, $pushAll, $popAll

FuncionalidadesFuncionalidades

Page 17: Mongo Db - PHP Day Workshop

• Manipulação server-side de dados usando Manipulação server-side de dados usando JavascriptJavascript

• GridFS para armazenamento eficiente de GridFS para armazenamento eficiente de arquivos binários grandesarquivos binários grandes

• Escalabilidade via: replicação e auto-Escalabilidade via: replicação e auto-sharding (alpha)sharding (alpha)

• Suporte a falhas: replicação master-Suporte a falhas: replicação master-mastermaster

FuncionalidadesFuncionalidades

Page 18: Mongo Db - PHP Day Workshop

• Alta performance (inserts/updates muito rápidos)Alta performance (inserts/updates muito rápidos)

• Excelente cache (pode eventualmente dispensar Excelente cache (pode eventualmente dispensar Memcache)Memcache)

• Escalabilidade (jura!?)Escalabilidade (jura!?)

• Documentos armazenados são Documentos armazenados são objetos/Json/Whatever (die ORM!!!)objetos/Json/Whatever (die ORM!!!)

• Schema-less = não precisa parar o site para Schema-less = não precisa parar o site para adicionar uma nova coluna na tabelaadicionar uma nova coluna na tabela

ProsPros

Page 19: Mongo Db - PHP Day Workshop

• Schema-less usa mais espaçoSchema-less usa mais espaçoem discoem disco

• Databases limitadas a 2GB em Databases limitadas a 2GB em sistemas 32 bit (ilimitadas em 64bit)sistemas 32 bit (ilimitadas em 64bit)

• Crash-recovery não é automáticoCrash-recovery não é automático

• Apesar de estável e em uso por grandes sites, Apesar de estável e em uso por grandes sites, bugs ainda são frequentes (principalmente nos bugs ainda são frequentes (principalmente nos drivers)drivers)

ContrasContras

Page 20: Mongo Db - PHP Day Workshop

• Aplicações web em geral que demandem Aplicações web em geral que demandem boa performance de inserts/updates/readsboa performance de inserts/updates/reads

• Armazenar dados de grande volume, baixo Armazenar dados de grande volume, baixo valor. valor.

• Logging / Analytics em Tempo RealLogging / Analytics em Tempo Real

• Armazenar diretamente objetos ou dados Armazenar diretamente objetos ou dados em Json (por ex: como os obtidos de APIs)em Json (por ex: como os obtidos de APIs)

Adequado paraAdequado para

Page 21: Mongo Db - PHP Day Workshop

• Sistemas altamente transacionais (Mongo Sistemas altamente transacionais (Mongo não garante atomicidade em transações)não garante atomicidade em transações)

• Problemas que necessitem de querys SQL Problemas que necessitem de querys SQL complexascomplexas

• Business IntelligenceBusiness Intelligence

Inadequado paraInadequado para

Page 22: Mongo Db - PHP Day Workshop

• Mysql ou outro RDBMS atende plenamenteMysql ou outro RDBMS atende plenamente

• Ainda assim existem bons motivos para Ainda assim existem bons motivos para usar MongoDB:usar MongoDB:• Facilidade de lidar com os objetosFacilidade de lidar com os objetos• Melhor performance Melhor performance • É legal conhecer e implementar novas É legal conhecer e implementar novas

tecnologiastecnologias

Ei, mais eu só quero fazer o site Ei, mais eu só quero fazer o site da padaria do meu tio!!!da padaria do meu tio!!!

Page 23: Mongo Db - PHP Day Workshop

• DatabasesDatabases

• ColeçõesColeções

• Documentos Documentos

• BSONBSON

Modelo de dadosModelo de dados

Page 24: Mongo Db - PHP Day Workshop

• Agrupamento físico de coleçõesAgrupamento físico de coleções

• Um arquivo de namespaces (nomes de Um arquivo de namespaces (nomes de coleções e índices) coleções e índices)

• Arquivos de dados (pré-alocação: 64 MB -Arquivos de dados (pré-alocação: 64 MB -> 128MB -> 256MB -> 512 MB -> 1GB -> > 128MB -> 256MB -> 512 MB -> 1GB -> 2GB -> 2GB...)2GB -> 2GB...)

• 10k coleções/databases (limite 10k coleções/databases (limite configurável)configurável)

DatabasesDatabases

Page 25: Mongo Db - PHP Day Workshop

• Agrupamento lógico de documentos em Agrupamento lógico de documentos em uma database (equivale às tabelas do uma database (equivale às tabelas do RDBMs)RDBMs)

• Schema-freeSchema-free

• Número ilimitado de documentosNúmero ilimitado de documentos

ColeçõesColeções

Page 26: Mongo Db - PHP Day Workshop

• Unidade de armazenamento (equivale às Unidade de armazenamento (equivale às linhas do RDBMs)linhas do RDBMs)

• Todos devem ter um _id único (em relação Todos devem ter um _id único (em relação à coleção)à coleção)

• Tamanho máximo de 4MB (para objetos Tamanho máximo de 4MB (para objetos maiores, use GridFS)maiores, use GridFS)

DocumentosDocumentos

Page 27: Mongo Db - PHP Day Workshop

• Formato de armazenamento de dados de Formato de armazenamento de dados de documentos ou objetos no MongoDBdocumentos ou objetos no MongoDB

• "Binary JSON""Binary JSON"

• Permite representação de algumas formas Permite representação de algumas formas de dados que não fazem parte do padrão de dados que não fazem parte do padrão JSON (Date / BinData, por exemplo)JSON (Date / BinData, por exemplo)

BSONBSON

Page 28: Mongo Db - PHP Day Workshop

• Binários disponíveis em 32/64 bit para Binários disponíveis em 32/64 bit para Linux, Windows, OS X e SolarisLinux, Windows, OS X e Solaris

• Versão 32 bit linux: Versão 32 bit linux: http://downloads.mongodb.org/linux/monghttp://downloads.mongodb.org/linux/mongodb-linux-i686-1.0.0.tgzodb-linux-i686-1.0.0.tgz

• Demais versões direto em Demais versões direto em http://www.mongodb.org/display/DOCS/Dohttp://www.mongodb.org/display/DOCS/Downloadswnloads

Baixando o MongoDBBaixando o MongoDB

Page 29: Mongo Db - PHP Day Workshop

• Extrair conteúdo do arquivo mongodb-linux-Extrair conteúdo do arquivo mongodb-linux-i686-1.0.0.tgz para pasta /mongodbi686-1.0.0.tgz para pasta /mongodb

• Crie pasta /data/db e marque com permissão Crie pasta /data/db e marque com permissão de escrita para o usuário desejadode escrita para o usuário desejado

• Execute o daemon: /mongodb/bin/mongod Execute o daemon: /mongodb/bin/mongod runrun

• Alternativa: usar um init scriptAlternativa: usar um init script• Scripts para Ubuntu e Centos em Scripts para Ubuntu e Centos em

www.sanainside.com/wp-content/uploads/2009/09/iwww.sanainside.com/wp-content/uploads/2009/09/initscripts-mongodb.zip nitscripts-mongodb.zip

Instalação do Servidor MongoDBInstalação do Servidor MongoDB

Page 30: Mongo Db - PHP Day Workshop

• Via pecl: pecl install mongo Via pecl: pecl install mongo channel://pecl.php.net/mongo-0.9.5channel://pecl.php.net/mongo-0.9.5

• Via GitHub: baixar source de Via GitHub: baixar source de http://github.com/mongodb/mongo-php-driver/tarball/master• Extrair conteúdo de tar.gzExtrair conteúdo de tar.gz• Acessar pasta e digitar no console:Acessar pasta e digitar no console:• $ phpize$ phpize• $ ./configure$ ./configure• $ sudo make install$ sudo make install

• Ao final, adicionar essa linha ao php.ini: Ao final, adicionar essa linha ao php.ini: extension=mongo.soextension=mongo.so

• Reiniciar apacheReiniciar apache

Instalação do Driver PHPInstalação do Driver PHP

Page 31: Mongo Db - PHP Day Workshop

• Shell : /mongodb/bin/mongoShell : /mongodb/bin/mongo

• Interface web: http://localhost:28017Interface web: http://localhost:28017

• Ferramentas para importar / exportar / Ferramentas para importar / exportar / backup / restore: [/mongodb/bin/] backup / restore: [/mongodb/bin/] mongoimportjson, mongoexport, mongoimportjson, mongoexport, mongodump, mongorestoremongodump, mongorestore

Incluso com MongoDBIncluso com MongoDB

Page 32: Mongo Db - PHP Day Workshop

• Abrir conexão:Abrir conexão:

• Por padrão, não há usuários nem senhas. Por padrão, não há usuários nem senhas. Configure seu firewall (como iptables) para Configure seu firewall (como iptables) para não deixar a porta exposta para ips não deixar a porta exposta para ips indesejadosindesejados

• É possível adicionar autenticação individual É possível adicionar autenticação individual para cada database, inserindo para cada database, inserindo usuário/senha na coleção "admin".usuário/senha na coleção "admin".

Usando MongoDB com PHPUsando MongoDB com PHP

$conn_mongodb = new Mongo();// Assume mongod rodando em localhost:27017 (default)

Page 33: Mongo Db - PHP Day Workshop

• $db = $conn_mongodb-$db = $conn_mongodb->selectDB("nomedadatabase");>selectDB("nomedadatabase");

• $col = $db->selectCollection("nomedacolecao");$col = $db->selectCollection("nomedacolecao");

• $col->insert($doc);$col->insert($doc);

• $col->save($doc);$col->save($doc);

• $cursor = $col->find($id);$cursor = $col->find($id);

• $cursor->getNext();$cursor->getNext();

Alguns métodos básicosAlguns métodos básicos

Page 34: Mongo Db - PHP Day Workshop

• Vamos implementar funções CRUD de um Vamos implementar funções CRUD de um sistema de blogging com:sistema de blogging com:• Multi-usuáriosMulti-usuários• PostsPosts• ComentáriosComentários• TagsTags• Contador de VisitasContador de Visitas• Lista de amigosLista de amigos

Implementando um MongoLog Implementando um MongoLog

Page 35: Mongo Db - PHP Day Workshop

• Database: blogDatabase: blog

• Coleções: users, posts, friendsColeções: users, posts, friends

• Cada documento da coleção posts conterá Cada documento da coleção posts conterá não só os textos de um post, como não só os textos de um post, como também os comentários, as tags e o também os comentários, as tags e o contador de visitas (“embed documents”)contador de visitas (“embed documents”)

ModelagemModelagem

Page 36: Mongo Db - PHP Day Workshop

Criando e inserindo na coleção Criando e inserindo na coleção "users""users"

• Não é necessário criar database/coleção Não é necessário criar database/coleção previamentepreviamente

• Um documento da coleção usuário:Um documento da coleção usuário:

• Pra inserir:Pra inserir:

• Se seu documento não tiver um "_id", Se seu documento não tiver um "_id", mongodb irá atribuir um MongoID mongodb irá atribuir um MongoID automaticamente (12 bytes)automaticamente (12 bytes)

$doc = array("_id" => 1, "email" => "[email protected]", "nome" => "Joaozinho", "nivel" => "admin_supremo");

$conn_mongodb->selectDB("blogs")->selectCollection("users")->save($doc);

Page 37: Mongo Db - PHP Day Workshop

Fazendo uma consultaFazendo uma consulta

• Assim como documentos, querys também Assim como documentos, querys também são especificadas como arraysão especificadas como array

• Retornar todos os campos de todos usuários Retornar todos os campos de todos usuários com nome Joaozinho:com nome Joaozinho:

• Retornar o email dos usuários com nome Retornar o email dos usuários com nome JoaozinhoJoaozinho

$query = array("nome" => "Joaozinho");$cursor = $conn_mongodb->selectDB("blogs")->selectCollection("users")->find($query)

$query = array("nome" => "Joaozinho");$fields = array("email" => true);$cursor = $conn_mongodb->selectDB("blogs")->selectCollection("users")->find($query,$fields);

Page 38: Mongo Db - PHP Day Workshop

find() vs findOne()find() vs findOne()

• find() retorna cursor para resultados encontrados:find() retorna cursor para resultados encontrados:

• findOne() retorna o documento (apenas um)findOne() retorna o documento (apenas um)

• find(), sem parametros, retorna cursor p/ todos find(), sem parametros, retorna cursor p/ todos docsdocs

$query = array(“_id” => “1”);$col = $conn_mongodb->selectDB("blogs")->selectCollection("users");$cursor = $col->find($query);while($cursor->hasNext()) {

$doc = $cursor->getNext();}

$query = array(“_id” => “1”);$col = $conn_mongodb->selectDB("blogs")->selectCollection("users");$doc = $col->findOne($query);

Page 39: Mongo Db - PHP Day Workshop

Inserindo um postInserindo um post

• Inicialmente o documento precisa conter apenas os Inicialmente o documento precisa conter apenas os campos do postcampos do post

• Ao fazer insert(), driver atribui MongoID em $doc[“_id”]Ao fazer insert(), driver atribui MongoID em $doc[“_id”]• Update para inserir tags. Dois métodos:Update para inserir tags. Dois métodos:

$doc = array(“titulo” => “Titulo do meu post”, “texto” => “Aqui vai meu textículo”, “data” => new MongoDate(), “idAutor” => 1));

$col->insert($doc);

// método português: adiciona tags ao array $doc e o salva no db:$doc[“tags”] = array(“teste”,”mongodb”);$col->save($doc)

// método l337: usando o “modificador” $set$query = array(“_id” => $doc[‘_id’]);$updatefields = array(‘$set’ => array(“tags” => array(“teste”,”mongodb”)));$col->update($query,$updatefields,true);

Page 40: Mongo Db - PHP Day Workshop

Inserindo comentários num postInserindo comentários num post

• Assim como tags, comentários também serão inseridos no documento Assim como tags, comentários também serão inseridos no documento do post, como um vetor de comentáriosdo post, como um vetor de comentários

• Usaremos o modificador “$push”, que permite inserir novos valores Usaremos o modificador “$push”, que permite inserir novos valores em um array sem necessidade de fornecer o array na queryem um array sem necessidade de fornecer o array na query

• Parametro 3 em update() aceita os valores “true” ou “false” (bool), e Parametro 3 em update() aceita os valores “true” ou “false” (bool), e determina que, caso não exista o documento com o _id passado no determina que, caso não exista o documento com o _id passado no parametro 1, ou o campo passado no parametro 2, Mongo faça a parametro 1, ou o campo passado no parametro 2, Mongo faça a criaçãocriação

$comentario = array(“nome” => “Comentador”, “email” => “[email protected]” “comentario” => “Que legal”);

$query = array(“_id” => $doc[“_id”]);$updatefields = array(‘$push’ => array(“comentarios” => $comentario));$col->update($query,$updatefields,true);

Page 41: Mongo Db - PHP Day Workshop

Contador de VisitasContador de Visitas

• Visitas serão contadas em um campo no documento Visitas serão contadas em um campo no documento de postsde posts

• Usaremos o modificar “$inc”, que permite Usaremos o modificar “$inc”, que permite incrementar o valor de um campoincrementar o valor de um campo

• No exemplo acima, fizemos um incremento de +1 no No exemplo acima, fizemos um incremento de +1 no campo visitas. Para fazer um incremento de +2, campo visitas. Para fazer um incremento de +2, usaríamos:usaríamos:

$query = array(“_id” => $doc[“_id”]);$updatefields = array(‘$inc’ => array(“visitas” => 1)); $col->update($query,$updatefields,true);

$updatefields = array(“$inc” => array(“visitas” => 2));

Page 42: Mongo Db - PHP Day Workshop

Lista de amigosLista de amigos

• Uma lista de amigos de um usuário pode ser um Uma lista de amigos de um usuário pode ser um documento cujo “_id” seja o “_id” dele na coleção documento cujo “_id” seja o “_id” dele na coleção “users” e com um campo “ids” contendo um array “users” e com um campo “ids” contendo um array de “_id” de seus amigosde “_id” de seus amigos

• Usaremos o modificador “$push”, assim como Usaremos o modificador “$push”, assim como fizemos nos comentários:fizemos nos comentários:

• Em vetores numéricos, podemos usar o modificador Em vetores numéricos, podemos usar o modificador “$pull” para excluir um valor:“$pull” para excluir um valor:

$col = $db->selectCollection(“friends”);$idUser = 1; $idFriend = 2;$query = array(“_id” => $idUser);$updatefields = array(‘$push’ => array(“ids” => $idFriend)); $col->update($query,$updatefields,true);

$query = array(“_id” => 1);$updatefields = array(“$pull” => array(“ids” => 2)); $col->update($query,$updatefields);

Page 43: Mongo Db - PHP Day Workshop

Contador, paginação e ordenaçãoContador, paginação e ordenação

• Contar o número de postsContar o número de posts

• Obter todos os posts em ordem cronológicaObter todos os posts em ordem cronológica

• Obter um post, pulando os dois primeirosObter um post, pulando os dois primeiros

$col = $db->selectCollection(“posts”);$cursor = $col->find();$cursor_ascendente = $cursor->sort(array(“data” => 1));$cursor_descendente = $cursor->sort(array(“data” => -1));

$col = $db->selectCollection(“posts”);$contador = $col->count();

$cursor = $col->find();$cursor->sort(array(“data” => -1));$cursor->skip(2);$cursor->limit(1);

Page 44: Mongo Db - PHP Day Workshop

Querys usando operadoresQuerys usando operadores

• Obter posts com mais de 2 visitas:Obter posts com mais de 2 visitas:

• Obter todos os posts sem comentáriosObter todos os posts sem comentários

• Obter todos os posts com a tag “mongo”Obter todos os posts com a tag “mongo”

$col = $db->selectCollection(“posts”);$query = array(“visitas” => array(‘$gt’ => 2))$cursor = $col->find($query);

$col = $db->selectCollection(“posts”);$query = array(“comentarios” => array(‘$exists’ => false))$cursor = $col->find($query);

$col = $db->selectCollection(“posts”);$query = array(“tags” => array(‘$in’ => “mongo”))$cursor = $col->find($query);

Page 45: Mongo Db - PHP Day Workshop

Querys usando operadoresQuerys usando operadores

• Obter posts contendo entre 1 e 3 visitas:Obter posts contendo entre 1 e 3 visitas:

• Obter todos os posts com 2 comentáriosObter todos os posts com 2 comentários

• Obter posts com uma das tags: “teste”, “mongo”, Obter posts com uma das tags: “teste”, “mongo”, “php”“php”

$col = $db->selectCollection(“posts”);$query = array(“visitas” => array(‘$gt’ => 1, ‘$lt’ => 3))$cursor = $col->find($query);

$col = $db->selectCollection(“posts”);$query = array(“comentarios” => array(‘$size’ => 2))$cursor = $col->find($query);

$col = $db->selectCollection(“posts”);$query = array(“tags” => array(‘$in’ => array(“mongo”, “teste”, “php”))$cursor = $col->find($query);

Page 46: Mongo Db - PHP Day Workshop

ÍndicesÍndices

• A query anterior pode ser otimizada adicionado um índice ao A query anterior pode ser otimizada adicionado um índice ao campo “tags”:campo “tags”:

• Em campos em que a ordem importa, pode-se determinar a Em campos em que a ordem importa, pode-se determinar a mesma num índice:mesma num índice:

• Para saber se uma query está usando índices, use explain:Para saber se uma query está usando índices, use explain:

$col = $db->selectCollection(“posts”);$col->ensureIndex(“tags”);

$col = $db->selectCollection(“posts”);$col->ensureIndex(array(“data” => 1)); // índice com ordem crescente $col->ensureIndex(array(“data” => -1)); // índice com ordem decrescente

$query = array(“tags” => “mongodb”);$cursor = $col->find($query);var_dump($cursor->explain());

Page 47: Mongo Db - PHP Day Workshop

Outras querys: remoçãoOutras querys: remoção

• Remover um usuário da coleção “users”Remover um usuário da coleção “users”

• Remover todos os usuáriosRemover todos os usuários

• Remove uma coleção:Remove uma coleção:

• Remove uma database:Remove uma database:

$col->remove();

$col = $db->selectCollection(“users”);$query = array(“nome” => “Joaozinho”);$col->remove($query);

$db->dropCollection(“users”);

$db->drop();

Page 48: Mongo Db - PHP Day Workshop

Outras querys: ErrosOutras querys: Erros

• No MongoDB, operações de escrita (insert / update / No MongoDB, operações de escrita (insert / update / delete) não bloqueam (“fire and forget”) e sempre delete) não bloqueam (“fire and forget”) e sempre retornam true. Para verificar se uma operação deu retornam true. Para verificar se uma operação deu erro, deve-se usar método lastError()erro, deve-se usar método lastError()

$doc = array(“_id” => 1);$col = $db->selectCollection(“error”);$col->insert($doc);if($error = $conn_mongodb->lastError()) {

echo "Error: "; var_dump($error);}

Page 49: Mongo Db - PHP Day Workshop

Indo alémIndo além

• No momento, mongodb só pode em hosts No momento, mongodb só pode em hosts dedicados / VPSdedicados / VPS

• Desenvolvedores estão propondo suporte em hosts Desenvolvedores estão propondo suporte em hosts compartilhadoscompartilhados

• Documentação da extensão mongophp:Documentação da extensão mongophp:• www.php.net/mongodbwww.php.net/mongodb

• Documentação oficial é bem completa:Documentação oficial é bem completa:• www.mongodb.comwww.mongodb.com

• Lista de discussão com participação ativa e Lista de discussão com participação ativa e prestativa dos desenvolvedores:prestativa dos desenvolvedores:• http://groups.google.com/group/mongodb-userhttp://groups.google.com/group/mongodb-user

Page 50: Mongo Db - PHP Day Workshop

Perguntas?Perguntas?