WORKSHOP ::: 1º PHP-DAY MongoDB: alternativa intuitiva e não-relacional ao Mysql Diego Sana
Sobre mim <ul><li>Desenvolvedor e empreendedor web há 10 anos </li></ul><ul><li>Graduando em Ciência da Computação na UFES...
Sumário <ul><li>Bancos de dados relacionais e seus problemas </li></ul><ul><li>Bancos de dados não-relacionais (e o &quot;...
Motivação <ul><li>Os bancos de dados relacionais se tornaram o &quot;martelo&quot; da indústria de armazenamento de dados ...
<ul><li>Na computação, tudo que é versátil demais, é menos eficiente </li></ul><ul><li>Bancos relacionais não &quot;casam&...
<ul><li>RDBMS (como o mysql) são usados certamente em 99,9% dos sites </li></ul><ul><li>99,9% dos sites não precisam de bo...
<ul><li>RDBMS sendo usados de forma não-relacional. Por que usá-los então? </li></ul><ul><li>Engenheiros de grandes empres...
<ul><li>Usada internamente em vários  serviços do Google </li></ul><ul><li>Escalável, tolerante a falhas e orientada colun...
<ul><li>Criada pela Amazon.com </li></ul><ul><li>Database chave / valor, alta escalabilidade / disponibilidade </li></ul><...
<ul><li>Projeto Open-Source iniciado  por empresa contratada para  desenvolver LiveJournal.com </li></ul><ul><li>Na verdad...
<ul><li>Apache Foundation. Orientado a documentos, schema free </li></ul><ul><li>Acesso via REST, documentos JSON </li></u...
<ul><li>Escalabilidade facilitada </li></ul><ul><li>Alta-performance </li></ul><ul><li>Modelos de dados simplificados/limi...
<ul><li>Um banco de dados  de alta performance, escalável, e  schema-free  orientado a  documentos </li></ul><ul><li>Em us...
<ul><li>Empresa americana 10gen, mesmo modelo da Mysql AB </li></ul><ul><li>Fundadores trouxeram experiência adquirida na ...
<ul><li>Databases estão se especializando  </li></ul><ul><li>O modelo orientado a documentos é de fácil implementação e  g...
<ul><li>Querys dinâmicas e mais parecidas com SQL </li></ul><ul><li>Suporte a índices, inclusive em vetores </li></ul><ul>...
<ul><li>Manipulação server-side de dados usando Javascript </li></ul><ul><li>GridFS para armazenamento eficiente de arquiv...
<ul><li>Alta performance (inserts/updates muito rápidos) </li></ul><ul><li>Excelente cache (pode eventualmente dispensar M...
<ul><li>Schema-less usa mais espaço em disco </li></ul><ul><li>Databases limitadas a 2GB em  sistemas 32 bit (ilimitadas e...
<ul><li>Aplicações web em geral que demandem boa performance de inserts/updates/reads </li></ul><ul><li>Armazenar dados de...
<ul><li>Sistemas altamente transacionais (Mongo não garante atomicidade em transações) </li></ul><ul><li>Problemas que nec...
<ul><li>Mysql ou outro RDBMS atende plenamente </li></ul><ul><li>Ainda assim existem bons motivos para usar MongoDB: </li>...
<ul><li>Databases </li></ul><ul><li>Coleções </li></ul><ul><li>Documentos  </li></ul><ul><li>BSON </li></ul>Modelo de dados
<ul><li>Agrupamento físico de coleções </li></ul><ul><li>Um arquivo de namespaces (nomes de coleções e índices)  </li></ul...
<ul><li>Agrupamento lógico de documentos em uma database (equivale às tabelas do RDBMs) </li></ul><ul><li>Schema-free </li...
<ul><li>Unidade de armazenamento (equivale às linhas do RDBMs) </li></ul><ul><li>Todos devem ter um _id único (em relação ...
<ul><li>Formato de armazenamento de dados de documentos ou objetos no MongoDB </li></ul><ul><li>&quot;Binary JSON&quot; </...
<ul><li>Binários disponíveis em 32/64 bit para Linux, Windows, OS X e Solaris </li></ul><ul><li>Versão 32 bit linux: http:...
<ul><li>Extrair conteúdo do arquivo mongodb-linux-i686-1.0.0.tgz para pasta /mongodb </li></ul><ul><li>Crie pasta /data/db...
<ul><li>Via pecl: pecl install mongo channel://pecl.php.net/mongo-0.9.5 </li></ul><ul><li>Via GitHub: baixar source de  ht...
<ul><li>Shell : /mongodb/bin/mongo </li></ul><ul><li>Interface web: http://localhost:28017 </li></ul><ul><li>Ferramentas p...
<ul><li>Abrir conexão: </li></ul><ul><li>Por padrão, não há usuários nem senhas. Configure seu firewall (como iptables) pa...
<ul><li>$db = $conn_mongodb->selectDB(&quot;nomedadatabase&quot;); </li></ul><ul><li>$col = $db->selectCollection(&quot;no...
<ul><li>Vamos implementar funções CRUD de um sistema de blogging com: </li></ul><ul><ul><li>Multi-usuários </li></ul></ul>...
<ul><li>Database: blog </li></ul><ul><li>Coleções: users, posts, friends </li></ul><ul><li>Cada documento da coleção posts...
Criando e inserindo na coleção &quot;users&quot; <ul><li>Não é necessário criar database/coleção previamente </li></ul><ul...
Fazendo uma consulta <ul><li>Assim como documentos, querys também são especificadas como array </li></ul><ul><li>Retornar ...
find() vs findOne() <ul><li>find() retorna cursor para resultados encontrados: </li></ul><ul><li>findOne() retorna o docum...
Inserindo um post <ul><li>Inicialmente o documento precisa conter apenas os campos do post </li></ul><ul><li>Ao fazer inse...
Inserindo comentários num post <ul><li>Assim como tags, comentários também serão inseridos no documento do post, como um v...
Contador de Visitas <ul><li>Visitas serão contadas em um campo no documento de posts </li></ul><ul><li>Usaremos o modifica...
Lista de amigos <ul><li>Uma lista de amigos de um usuário pode ser um documento cujo “_id” seja o “_id” dele na coleção “u...
Contador, paginação e ordenação <ul><li>Contar o número de posts </li></ul><ul><li>Obter todos os posts em ordem cronológi...
Querys usando operadores <ul><li>Obter posts com mais de 2 visitas: </li></ul><ul><li>Obter todos os posts sem comentários...
Querys usando operadores <ul><li>Obter posts contendo entre 1 e 3 visitas: </li></ul><ul><li>Obter todos os posts com 2 co...
Índices <ul><li>A query anterior pode ser otimizada adicionado um índice ao campo “tags”: </li></ul><ul><li>Em campos em q...
Outras querys: remoção <ul><li>Remover um usuário da coleção “users” </li></ul><ul><li>Remover todos os usuários </li></ul...
Outras querys: Erros <ul><li>No MongoDB, operações de escrita (insert / update / delete) não bloqueam (“fire and forget”) ...
Indo além <ul><li>No momento, mongodb só pode em hosts dedicados / VPS </li></ul><ul><li>Desenvolvedores estão propondo su...
Perguntas?
Upcoming SlideShare
Loading in …5
×

Mongo Db - PHP Day Workshop

3,898 views

Published on

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

Published in: Technology
2 Comments
6 Likes
Statistics
Notes
No Downloads
Views
Total views
3,898
On SlideShare
0
From Embeds
0
Number of Embeds
137
Actions
Shares
0
Downloads
110
Comments
2
Likes
6
Embeds 0
No embeds

No notes for slide

Mongo Db - PHP Day Workshop

  1. 1. WORKSHOP ::: 1º PHP-DAY MongoDB: alternativa intuitiva e não-relacional ao Mysql Diego Sana
  2. 2. Sobre mim <ul><li>Desenvolvedor e empreendedor web há 10 anos </li></ul><ul><li>Graduando em Ciência da Computação na UFES </li></ul><ul><ul><li>1999: freemp3.com.br </li></ul></ul><ul><ul><li>2000: Central da Música (.com.br) </li></ul></ul><ul><ul><ul><li>Premiado pelo iBest em 2001 e 2003 </li></ul></ul></ul><ul><ul><li>2003: Primeiro contato com PHP </li></ul></ul><ul><ul><li>2004: Flogão.com.br (PHP, databases, escalabilidade) </li></ul></ul><ul><ul><li>2007: Power.com (idem) </li></ul></ul><ul><ul><li>2009: Restarting (bye-bye mysql, thanks for all the fish) </li></ul></ul><ul><li>Blog: www.sanainside.com, Twitter: @sanainside </li></ul>
  3. 3. Sumário <ul><li>Bancos de dados relacionais e seus problemas </li></ul><ul><li>Bancos de dados não-relacionais (e o &quot;movimento&quot; NOSQL) </li></ul><ul><li>MongoDB: o que é, quem faz, filosofia, funcionalidades, pros, contras, por que usar </li></ul><ul><li>MongoDB: Botando a mão na massa </li></ul><ul><li>MongoDB: indo além </li></ul>
  4. 4. Motivação <ul><li>Os bancos de dados relacionais se tornaram o &quot;martelo&quot; da indústria de armazenamento de dados </li></ul><ul><li>Facilidade para entender o modelo relacional de dados e consultá-los </li></ul><ul><li>Versatilidade </li></ul>
  5. 5. <ul><li>Na computação, tudo que é versátil demais, é menos eficiente </li></ul><ul><li>Bancos relacionais não &quot;casam&quot; com o paradigma OO. Necessidade de ORMs (“O Vietnã da Ciência da Computação“) </li></ul><ul><li>Concebidos no final da década de 70, quando não existia a ... WEB!!! </li></ul>Porém…
  6. 6. <ul><li>RDBMS (como o mysql) são usados certamente em 99,9% dos sites </li></ul><ul><li>99,9% dos sites não precisam de boa parte de suas funcionalidades (ACID, triggers, stored procedures quem?) </li></ul><ul><li>Apesar da versatilidade, não são tão flexíveis </li></ul><ul><li>Pra escalar, só fazendo muita magia e rasgando o manual (foda-se normalização, fodam-se chaves estrangeiras, fodam-se os joins) </li></ul>RDBMS e a web …
  7. 7. <ul><li>RDBMS sendo usados de forma não-relacional. Por que usá-los então? </li></ul><ul><li>Engenheiros de grandes empresas da WEB desenvolveram suas próprias databases para resolver seus problemas de escala </li></ul><ul><li>Algumas open-source, e as que não são foram &quot;clonadas&quot; por projetos Open-Source </li></ul><ul><li>&quot;Cool Kids&quot; chamam esse &quot;movimento&quot; de NoSQL </li></ul>Podemos fazer melhor: NoSQL
  8. 8. <ul><li>Usada internamente em vários serviços do Google </li></ul><ul><li>Escalável, tolerante a falhas e orientada colunas/linhas (híbrida) </li></ul><ul><li>Disponível para uso com Google App Engine </li></ul><ul><li>Clones open-source: HBase e HyperTable </li></ul>Exemplos: BigTable
  9. 9. <ul><li>Criada pela Amazon.com </li></ul><ul><li>Database chave / valor, alta escalabilidade / disponibilidade </li></ul><ul><li>Disponível para uso via Amazon Web Services (&quot;SimpleDB&quot;) </li></ul><ul><li>Clone Open-source: Project Voldemort (Linkedin) </li></ul>Exemplos: Dynamo
  10. 10. <ul><li>Projeto Open-Source iniciado por empresa contratada para desenvolver LiveJournal.com </li></ul><ul><li>Na verdade um camada de cache chave/valor, alta escalabilidade/disponibilidade </li></ul><ul><li>MemcacheDB = Memcache + BerkeleyDB = persistência em disco </li></ul><ul><li>Redis = Memcache não-volátil e com mais estruturas de dados (strings, listas, conjuntos) </li></ul>Exemplos: Memcache
  11. 11. <ul><li>Apache Foundation. Orientado a documentos, schema free </li></ul><ul><li>Acesso via REST, documentos JSON </li></ul><ul><li>ACID </li></ul><ul><li>Querys precisam ser pré-definidas (criação de views) </li></ul>Exemplos: CouchDB
  12. 12. <ul><li>Escalabilidade facilitada </li></ul><ul><li>Alta-performance </li></ul><ul><li>Modelos de dados simplificados/limitados </li></ul><ul><li>Quase sempre querys simples, estilo &quot;Select * from tabela where ID='xxx'&quot; </li></ul>O que todos eles tem em comum
  13. 13. <ul><li>Um banco de dados de alta performance, escalável, e schema-free orientado a documentos </li></ul><ul><li>Em uso há quase 2 anos. Beta desde fev/2009. Versão 1.0 GA em agosto/2009 </li></ul><ul><li>Preenche lacuna entre as databases do tipo Chave / Valor (rápidas e escaláveis) e os tradicionais RDBMS (que tem mais funcionalidades) </li></ul>Mongo DB: o melhor dos dois mundos
  14. 14. <ul><li>Empresa americana 10gen, mesmo modelo da Mysql AB </li></ul><ul><li>Fundadores trouxeram experiência adquirida na DoubleClick </li></ul>Quem faz
  15. 15. <ul><li>Databases estão se especializando </li></ul><ul><li>O modelo orientado a documentos é de fácil implementação e gerenciamento, proporciona melhor performance </li></ul><ul><li>Redução de capacidades para maior performance é importante, mas há necessidade de mais funcionalidades que as providas por databases chave/valor </li></ul>Filosofia
  16. 16. <ul><li>Querys dinâmicas e mais parecidas com SQL </li></ul><ul><li>Suporte a índices, inclusive em vetores </li></ul><ul><li>Query profiling </li></ul><ul><li>Operadores $gt, $gte, $lt, $lte, $eq, $neq, $exists, $set, $mod, $where, $in, $inc, $pull, $push, $pop, $pushAll, $popAll </li></ul>Funcionalidades
  17. 17. <ul><li>Manipulação server-side de dados usando Javascript </li></ul><ul><li>GridFS para armazenamento eficiente de arquivos binários grandes </li></ul><ul><li>Escalabilidade via: replicação e auto-sharding (alpha) </li></ul><ul><li>Suporte a falhas: replicação master-master </li></ul>Funcionalidades
  18. 18. <ul><li>Alta performance (inserts/updates muito rápidos) </li></ul><ul><li>Excelente cache (pode eventualmente dispensar Memcache) </li></ul><ul><li>Escalabilidade (jura!?) </li></ul><ul><li>Documentos armazenados são objetos/Json/Whatever (die ORM!!!) </li></ul><ul><li>Schema-less = não precisa parar o site para adicionar uma nova coluna na tabela </li></ul>Pros
  19. 19. <ul><li>Schema-less usa mais espaço em disco </li></ul><ul><li>Databases limitadas a 2GB em sistemas 32 bit (ilimitadas em 64bit) </li></ul><ul><li>Crash-recovery não é automático </li></ul><ul><li>Apesar de estável e em uso por grandes sites, bugs ainda são frequentes (principalmente nos drivers) </li></ul>Contras
  20. 20. <ul><li>Aplicações web em geral que demandem boa performance de inserts/updates/reads </li></ul><ul><li>Armazenar dados de grande volume, baixo valor. </li></ul><ul><li>Logging / Analytics em Tempo Real </li></ul><ul><li>Armazenar diretamente objetos ou dados em Json (por ex: como os obtidos de APIs) </li></ul>Adequado para
  21. 21. <ul><li>Sistemas altamente transacionais (Mongo não garante atomicidade em transações) </li></ul><ul><li>Problemas que necessitem de querys SQL complexas </li></ul><ul><li>Business Intelligence </li></ul>Inadequado para
  22. 22. <ul><li>Mysql ou outro RDBMS atende plenamente </li></ul><ul><li>Ainda assim existem bons motivos para usar MongoDB: </li></ul><ul><ul><li>Facilidade de lidar com os objetos </li></ul></ul><ul><ul><li>Melhor performance </li></ul></ul><ul><ul><li>É legal conhecer e implementar novas tecnologias </li></ul></ul>Ei, mais eu só quero fazer o site da padaria do meu tio!!!
  23. 23. <ul><li>Databases </li></ul><ul><li>Coleções </li></ul><ul><li>Documentos </li></ul><ul><li>BSON </li></ul>Modelo de dados
  24. 24. <ul><li>Agrupamento físico de coleções </li></ul><ul><li>Um arquivo de namespaces (nomes de coleções e índices) </li></ul><ul><li>Arquivos de dados (pré-alocação: 64 MB -> 128MB -> 256MB -> 512 MB -> 1GB -> 2GB -> 2GB...) </li></ul><ul><li>10k coleções/databases (limite configurável) </li></ul>Databases
  25. 25. <ul><li>Agrupamento lógico de documentos em uma database (equivale às tabelas do RDBMs) </li></ul><ul><li>Schema-free </li></ul><ul><li>Número ilimitado de documentos </li></ul>Coleções
  26. 26. <ul><li>Unidade de armazenamento (equivale às linhas do RDBMs) </li></ul><ul><li>Todos devem ter um _id único (em relação à coleção) </li></ul><ul><li>Tamanho máximo de 4MB (para objetos maiores, use GridFS) </li></ul>Documentos
  27. 27. <ul><li>Formato de armazenamento de dados de documentos ou objetos no MongoDB </li></ul><ul><li>&quot;Binary JSON&quot; </li></ul><ul><li>Permite representação de algumas formas de dados que não fazem parte do padrão JSON (Date / BinData, por exemplo) </li></ul>BSON
  28. 28. <ul><li>Binários disponíveis em 32/64 bit para Linux, Windows, OS X e Solaris </li></ul><ul><li>Versão 32 bit linux: http://downloads.mongodb.org/linux/mongodb-linux-i686-1.0.0.tgz </li></ul><ul><li>Demais versões direto em http://www.mongodb.org/display/DOCS/Downloads </li></ul>Baixando o MongoDB
  29. 29. <ul><li>Extrair conteúdo do arquivo mongodb-linux-i686-1.0.0.tgz para pasta /mongodb </li></ul><ul><li>Crie pasta /data/db e marque com permissão de escrita para o usuário desejado </li></ul><ul><li>Execute o daemon: /mongodb/bin/mongod run </li></ul><ul><li>Alternativa: usar um init script </li></ul><ul><ul><li>Scripts para Ubuntu e Centos em www.sanainside.com/wp-content/uploads/2009/09/initscripts-mongodb.zip </li></ul></ul>Instalação do Servidor MongoDB
  30. 30. <ul><li>Via pecl: pecl install mongo channel://pecl.php.net/mongo-0.9.5 </li></ul><ul><li>Via GitHub: baixar source de http://github.com/mongodb/mongo-php-driver/tarball/master </li></ul><ul><ul><li>Extrair conteúdo de tar.gz </li></ul></ul><ul><ul><li>Acessar pasta e digitar no console: </li></ul></ul><ul><ul><li>$ phpize </li></ul></ul><ul><ul><li>$ ./configure </li></ul></ul><ul><ul><li>$ sudo make install </li></ul></ul><ul><li>Ao final, adicionar essa linha ao php.ini: extension=mongo.so </li></ul><ul><li>Reiniciar apache </li></ul>Instalação do Driver PHP
  31. 31. <ul><li>Shell : /mongodb/bin/mongo </li></ul><ul><li>Interface web: http://localhost:28017 </li></ul><ul><li>Ferramentas para importar / exportar / backup / restore: [/mongodb/bin/] mongoimportjson, mongoexport, mongodump, mongorestore </li></ul>Incluso com MongoDB
  32. 32. <ul><li>Abrir conexão: </li></ul><ul><li>Por padrão, não há usuários nem senhas. Configure seu firewall (como iptables) para não deixar a porta exposta para ips indesejados </li></ul><ul><li>É possível adicionar autenticação individual para cada database, inserindo usuário/senha na coleção &quot;admin&quot;. </li></ul>Usando MongoDB com PHP $conn_mongodb = new Mongo(); // Assume mongod rodando em localhost:27017 (default)
  33. 33. <ul><li>$db = $conn_mongodb->selectDB(&quot;nomedadatabase&quot;); </li></ul><ul><li>$col = $db->selectCollection(&quot;nomedacolecao&quot;); </li></ul><ul><li>$col->insert($doc); </li></ul><ul><li>$col->save($doc); </li></ul><ul><li>$cursor = $col->find($id); </li></ul><ul><li>$cursor->getNext(); </li></ul>Alguns métodos básicos
  34. 34. <ul><li>Vamos implementar funções CRUD de um sistema de blogging com: </li></ul><ul><ul><li>Multi-usuários </li></ul></ul><ul><ul><li>Posts </li></ul></ul><ul><ul><li>Comentários </li></ul></ul><ul><ul><li>Tags </li></ul></ul><ul><ul><li>Contador de Visitas </li></ul></ul><ul><ul><li>Lista de amigos </li></ul></ul>Implementando um MongoLog 
  35. 35. <ul><li>Database: blog </li></ul><ul><li>Coleções: users, posts, friends </li></ul><ul><li>Cada documento da coleção posts conterá não só os textos de um post, como também os comentários, as tags e o contador de visitas (“embed documents”) </li></ul>Modelagem
  36. 36. Criando e inserindo na coleção &quot;users&quot; <ul><li>Não é necessário criar database/coleção previamente </li></ul><ul><li>Um documento da coleção usuário: </li></ul><ul><li>Pra inserir: </li></ul><ul><li>Se seu documento não tiver um &quot;_id&quot;, mongodb irá atribuir um MongoID automaticamente (12 bytes) </li></ul>$doc = array(&quot;_id&quot; => 1, &quot;email&quot; => &quot;meu@email.com&quot;, &quot;nome&quot; => &quot;Joaozinho&quot;, &quot;nivel&quot; => &quot;admin_supremo&quot;); $conn_mongodb->selectDB(&quot;blogs&quot;)->selectCollection(&quot;users&quot;)->save($doc);
  37. 37. Fazendo uma consulta <ul><li>Assim como documentos, querys também são especificadas como array </li></ul><ul><li>Retornar todos os campos de todos usuários com nome Joaozinho: </li></ul><ul><li>Retornar o email dos usuários com nome Joaozinho </li></ul>$query = array(&quot;nome&quot; => &quot;Joaozinho&quot;); $cursor = $conn_mongodb->selectDB(&quot;blogs&quot;)->selectCollection(&quot;users&quot;) ->find($query) $query = array(&quot;nome&quot; => &quot;Joaozinho&quot;); $fields = array(&quot;email&quot; => true); $cursor = $conn_mongodb->selectDB(&quot;blogs&quot;)->selectCollection(&quot;users&quot;) ->find($query,$fields);
  38. 38. find() vs findOne() <ul><li>find() retorna cursor para resultados encontrados: </li></ul><ul><li>findOne() retorna o documento (apenas um) </li></ul><ul><li>find(), sem parametros, retorna cursor p/ todos docs </li></ul>$query = array(“_id” => “1”); $col = $conn_mongodb->selectDB(&quot;blogs&quot;)->selectCollection(&quot;users&quot;); $cursor = $col->find($query); while($cursor->hasNext()) { $doc = $cursor->getNext(); } $query = array(“_id” => “1”); $col = $conn_mongodb->selectDB(&quot;blogs&quot;)->selectCollection(&quot;users&quot;); $doc = $col->findOne($query);
  39. 39. Inserindo um post <ul><li>Inicialmente o documento precisa conter apenas os campos do post </li></ul><ul><li>Ao fazer insert(), driver atribui MongoID em $doc[“_id”] </li></ul><ul><li>Update para inserir tags. Dois métodos: </li></ul>$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);
  40. 40. Inserindo comentários num post <ul><li>Assim como tags, comentários também serão inseridos no documento do post, como um vetor de comentários </li></ul><ul><li>Usaremos o modificador “$push”, que permite inserir novos valores em um array sem necessidade de fornecer o array na query </li></ul><ul><li>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 parametro 1, ou o campo passado no parametro 2, Mongo faça a criação </li></ul>$comentario = array(“nome” => “Comentador”, “email” => “me@obriga.com” “ comentario” => “Que legal”); $query = array(“_id” => $doc[“_id”]); $updatefields = array(‘$push’ => array(“comentarios” => $comentario)); $col->update($query,$updatefields,true);
  41. 41. Contador de Visitas <ul><li>Visitas serão contadas em um campo no documento de posts </li></ul><ul><li>Usaremos o modificar “$inc”, que permite incrementar o valor de um campo </li></ul><ul><li>No exemplo acima, fizemos um incremento de +1 no campo visitas. Para fazer um incremento de +2, usaríamos: </li></ul>$query = array(“_id” => $doc[“_id”]); $updatefields = array(‘$inc’ => array(“visitas” => 1)); $col->update($query,$updatefields,true); $updatefields = array(“$inc” => array(“visitas” => 2));
  42. 42. Lista de amigos <ul><li>Uma lista de amigos de um usuário pode ser um documento cujo “_id” seja o “_id” dele na coleção “users” e com um campo “ids” contendo um array de “_id” de seus amigos </li></ul><ul><li>Usaremos o modificador “$push”, assim como fizemos nos comentários: </li></ul><ul><li>Em vetores numéricos, podemos usar o modificador “$pull” para excluir um valor: </li></ul>$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);
  43. 43. Contador, paginação e ordenação <ul><li>Contar o número de posts </li></ul><ul><li>Obter todos os posts em ordem cronológica </li></ul><ul><li>Obter um post, pulando os dois primeiros </li></ul>$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);
  44. 44. Querys usando operadores <ul><li>Obter posts com mais de 2 visitas: </li></ul><ul><li>Obter todos os posts sem comentários </li></ul><ul><li>Obter todos os posts com a tag “mongo” </li></ul>$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);
  45. 45. Querys usando operadores <ul><li>Obter posts contendo entre 1 e 3 visitas: </li></ul><ul><li>Obter todos os posts com 2 comentários </li></ul><ul><li>Obter posts com uma das tags: “teste”, “mongo”, “php” </li></ul>$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);
  46. 46. Índices <ul><li>A query anterior pode ser otimizada adicionado um índice ao campo “tags”: </li></ul><ul><li>Em campos em que a ordem importa, pode-se determinar a mesma num índice: </li></ul><ul><li>Para saber se uma query está usando índices, use explain: </li></ul>$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());
  47. 47. Outras querys: remoção <ul><li>Remover um usuário da coleção “users” </li></ul><ul><li>Remover todos os usuários </li></ul><ul><li>Remove uma coleção: </li></ul><ul><li>Remove uma database: </li></ul>$col->remove(); $col = $db->selectCollection(“users”); $query = array(“nome” => “Joaozinho”); $col->remove($query); $db->dropCollection(“users”); $db->drop();
  48. 48. Outras querys: Erros <ul><li>No MongoDB, operações de escrita (insert / update / delete) não bloqueam (“fire and forget”) e sempre retornam true. Para verificar se uma operação deu erro, deve-se usar método lastError() </li></ul>$doc = array(“_id” => 1); $col = $db->selectCollection(“error”); $col->insert($doc); if($error = $conn_mongodb->lastError()) { echo &quot;Error: &quot;; var_dump($error); }
  49. 49. Indo além <ul><li>No momento, mongodb só pode em hosts dedicados / VPS </li></ul><ul><li>Desenvolvedores estão propondo suporte em hosts compartilhados </li></ul><ul><li>Documentação da extensão mongophp: </li></ul><ul><ul><li>www.php.net/mongodb </li></ul></ul><ul><li>Documentação oficial é bem completa: </li></ul><ul><ul><li>www.mongodb.com </li></ul></ul><ul><li>Lista de discussão com participação ativa e prestativa dos desenvolvedores: </li></ul><ul><ul><li>http://groups.google.com/group/mongodb-user </li></ul></ul>
  50. 50. Perguntas?

×