Curso mongo db com php

5,159 views
4,962 views

Published on

Published in: Technology
2 Comments
11 Likes
Statistics
Notes
No Downloads
Views
Total views
5,159
On SlideShare
0
From Embeds
0
Number of Embeds
15
Actions
Shares
0
Downloads
151
Comments
2
Likes
11
Embeds 0
No embeds

No notes for slide

Curso mongo db com php

  1. 1. MongoDB com PHPJean Carlo Nascimento aka Suissa
  2. 2. Links nosqlbr.com.br jquerybrasil.org frontendbrasil.com.br javascriptbrasil.com.brcomoprogramarphp.com.br github.com/suissa about.me/suissa @osuissa
  3. 3. Introdução
  4. 4. NoSQLPor que usar?
  5. 5. NoSQLOnde usar?
  6. 6. NoSQLTipos de armazenamento?
  7. 7. Key/Value StoreEsse é o tipo de banco de dados NoSQL mais simples o conceito dele é umachave e um valor para essa chave, mas ele é o que aguenta mais carga dedados. Esses tipos de bancos de dados, são o que tem a maior escalabilidade.Berkeley DBTokyo CabinetKyoto CabinetProject VoldermortMemcacheDBSimpleBDRedisRiak
  8. 8. Wide Column StoreFortemente inspirados pelo BigTable do Google eles suportam várias linhas ecolunas, alem disso ele permite subcolunas. Alem do BigTable do googleoutros que usam essa tecnologia são:HBase(Apache)HiperTableCassandra(Apache)
  9. 9. Document StoreBaseado em documentos XML ou JSON, podem ser localizados pelo seu idunico ou por qualquer registro que tenha no documento.CouchDB(Apache)MongoDBRavenDB
  10. 10. Graph StoreCom uma complexibilidade maior esses bancos de dados guardam objetos enão registros como os outros tipos de NoSQL. A busca destes itens são feitaspela navegação destes objetos.TitanNeo4JInfoGridHyperGraphDB
  11. 11. Column Oriented StoreEsses são bancos de dados relacionais, porem eles tem caracteristicas doNoSQL a principal diferença deles é que os dados são armazenados emcolunas, ajudando na escalabilidade.VerticaMonetDBLucidDBInfobrightIngres/Vectorwise
  12. 12. Cases ReaisUm case real interessante é da Netflix que utiliza 3 bancos NoSQL: SimpleDB,HBase e Cassandra.http://techblog.netflix.com/2011/01/nosql-at-netflix.html
  13. 13. Cases ReaisPara o MongoDB que será nosso banco de estudo temos as seguintesempresas utilizando-o em produção:● SAP● Craigslist● Shutterfly● foursquare● bit.ly● SourceForge● Disney
  14. 14. Cases Reais● MTV Networks● GitHub● Justin.tv● CollegeHumor● SugarCRM● GrooveShark● CartolaFChttp://www.mongodb.org/display/DOCS/Use+Cases
  15. 15. MongoDB● C++● JSON/BSON● Replica● Sharding● GridFS● Map/Reduce
  16. 16. MongoDB - Instalação● Mac● Linux● Windows
  17. 17. MongoDB - Terminologia SQL RDBMS MongoDB DATABASE DATABASE TABLE COLLECTION ROWS JSON QUERY DOCUMENT INDEX QUERY PARTITION INDEXSHARD
  18. 18. MongoDB - Coleçãouse minha_databaseshow dbsdb.nome_da_collection.comando()Ex.:db.nome_da_collection.drop() //apaga coleçãodb.nome_da_collection.remove() //limpa coleção
  19. 19. MongoDB - Inserçãoprof1 = {"nome": "Jean Carlo Nascimento", "apelido": "suissa", "idade": 27, "disciplinas":["MongoDB", "PHP"]};db.professores.insert(prof1)prof2 = {"nome": "Wesley William", "apelido": "wesley", "idade": 25, "disciplinas": ["PHP"]};db.professores.insert(prof2)// lembrando que o JSON valido necessita de aspas no nome do campo
  20. 20. MongoDB - Consultadb.colecao.find({clausulas, campos})Ex.:select * from professores where apelido = "suissa"db.professores.find( { apelido : "suissa" } );select * from professores where nome LIKE "Jean*"db.professores.find( { nome : /Jean*/i } );db.professores.find( { nome : { $regex : Jean*} } );select nome, idade from professoresdb.professores.find(null, {nome:1, idade:1} )select nome, idade from professores where apelido = "suissa"db.professores.find( { apelido : "suissa" }, { nome:1, idade:1 } );
  21. 21. MongoDB - Operadores$lt - menor que <$lte - menor ou igual que <=$gt - maior que >$gte - maior ou igual que >=
  22. 22. MongoDB - Operadores$all - retorna o objeto onde todos os valores foram encontrados$exists - retorna o objeto caso uma chave existe$or - retorna o objeto caso a cláusula OU for verdadeira$and - retorna o objeto caso a cláusula E for verdadeira$type - retorna o objeto caso a chave seja do tipo especificado para conferir a lista dostipos e seus valores acesse: Lista dos tipos e seus valores
  23. 23. MongoDB - Operadores$ne- retorna o objeto onde o valor não foi encontrado$in- retorna o objeto se o valor foi encontrado$nin- retorna o objeto se nenhum dos valores foi encontrado$nor- retorna o objeto caso a cláusula negação do OU for verdadeira$mod - retorna o objeto quando o módulo de um valor foi encontrado
  24. 24. MongoDB - Countselect count(*) from professoresdb.professores.count()select count(*) from professores where idade > 30db.professores.count({idade:{$lt: 30}})
  25. 25. MongoDB - Ordenaçãoselect * from professores order by nome ASCdb.professores.find().sort({nome:1})select * from professores order by idade DESCdb.professores.find().sort({idade:-1})
  26. 26. MongoDB - Limitselect * from professores order by nome ASC limit 0,2db.professores.find().sort({nome:1}).limit(2)select * from professores limit 2 offset 10db.professores.find().limit(2).skip(10)
  27. 27. MongoDB - Alteraçãoprofessor = db.professores.findOne( { name : "Jean" } );professor.idade = 28;db.professores.save(professor);//lembrando que o findOne retorna apenas um registro//pois o find mesmo retornando um registro retornará dentro de um cursor
  28. 28. MongoDB - Exclusãodb.professores.remove(); // exclui tudodb.things.remove({nome: "Jean"}); // exclui todos os registro com nome = Jean
  29. 29. MongoDB - ÍndicesPara criarmos um índice usamos o ensureIndex().db.professores.ensureIndex({ email:1 });Para pegarmos todos os índices da nossa collection professores usamos getIndexes().db.professores.getIndexes()Para pegar todos os índices da database usamos o find() em uma collection do sistema.db.system.indexes.find()
  30. 30. Sharding - O que éSharding é a divisão da informação em partes iguais e divididas entre os nós.
  31. 31. Sharding - Como funcionaO MondoDB ira dividir nossas informações através dos servidores de sharding setados emsua configuração, levando em conta a shard key.
  32. 32. Sharding - ConfigurandoPrimeiramente precisamos criar os serviços de sharding. Esse exemplo é apenas didático eserá rodado em apenas um servidor.mkdir /data/db/a /data/db/bmongod --shardsvr --dbpath /data/db/a --port 10000 > /tmp/sharda.log &cat /tmp/sharda.logmongod --shardsvr --dbpath /data/db/b --port 10001 > /tmp/shardb.log &cat /tmp/shardb.logObs.: O cat serve apenas para verificarmos se o serviço subiu realmente e o & serve pararodar em background.
  33. 33. Sharding - ConfigurandoVamos configurar os servidores.mkdir /data/db/configmongod --configsvr --dbpath /data/db/config --port 20000 > /tmp/configdb.log &cat /tmp/configdb.logmongos --configdb localhost:20000 > /tmp/mongos.log &cat /tmp/mongos.log
  34. 34. Sharding - ConfigurandoPrecisamos dizer qual database, collection e nossa shard key.db.runCommand( { enablesharding : "test" } ){"ok" : 1}db.runCommand( { shardcollection : "test.people", key : {name : 1} } ){ "collectionsharded" : "test.people", "ok" : 1 }
  35. 35. Sharding - PHP$mongo->selectDB(admin)->command(array(addshard=>hostname:port));
  36. 36. MongoDB - GridFSGridFS é o sistema de arquivos do MongoDb e deve ser usado quando precisamosarmazenar arquivos maiores que 1Mb.mongofiles -d myfiles put my_music.mp3connected to: 127.0.0.1added file: { _id: ObjectId(4ce9ddcb45d74ecaa7f5a029), filename: "my_music.mp3", chunkSize: 262144, uploadDate: new Date(1290395084166), md5: "7872291d4e67ae8b8bf7aea489ab52c1", length: 1419631 }
  37. 37. MongoDB - GridFS - inserindo $conn = new Mongo("127.0.0.1:27017"); // Connect $db = $conn->uniform_server; // Select DB $db->authenticate("user","password"); // Authenticate to MongoDB $grid = $db->getGridFS(); // Initialize GridFS $name = $_FILES[Filedata][name]; // Get Uploaded file name $type = $_FILES[Filedata][type]; // Try to get file extension $id = $grid->storeUpload(Filedata,$name); // Store uploaded file to GridFS
  38. 38. MongoDB - GridFS - inserindo Mais exemplos em: http://blog.hardkap.com/index.php/posts/00069/MongoDB---GridFS
  39. 39. MongoDB - GridFS - listando $conn = new Mongo("127.0.0.1:27017"); // Connect $db = $conn->uniform_server; // Select DB $db->authenticate("user","password"); // Authenticate to MongoDB $grid = $db->getGridFS(); // Initialize GridFS $cursor = $grid->find(); foreach ($cursor as $obj) { // iterate through the results echo Filename: .$obj->getFilename(). Size: .$obj->getSize().<br/>; } $conn->close(); // Disconnect from Server exit(0);
  40. 40. MongoDB - DBRefDBRef é o esquema nativo de referencia interna entre os documentos. O driver do PHPexecutará a query no objeto desejada, trazendo os objetos referenciados via DBRefdiretamente.
  41. 41. MongoDB - DBRefDBRefs possui os seguintes campos:$ref: nome da collection referenciada.$id: valor do _id do documento referenciado.$db: opcional e contém o nome da database onde o documento esta referenciado.*Apenas alguns drivers possuem suporte.Um documento DBRef pode ser exemplificado assim: { $ref : <value>, $id : <value>, $db : <value> } new DBRef ( customers , ObjectId("4ef4a61a90eec3e3c748263c") )
  42. 42. MongoDB - DBRefInserir esses registros:db.fruit.save ({"_id" : "1" , "name" : "apple"});db.fruit.save ({"_id" : "2" , "name" : "grape"});db.fruit.save ({"_id" : "3" , "name" : "orange"});db.fruit.save ({"_id" : "4" , "name" : "pineapple"});db.basket.save ({"_id" : "1", "items" : [ {"quantity" : 5 , item : {"$ref" : "fruit", "$id" : "1"}}, {"quantity" : 10, item : {"$ref" : "fruit", "$id" : "3"}}]})db.basket.find ()
  43. 43. MongoDB - Admin UIsSistemas para administração visual são uma mão na roda para qualquer Banco de dados,como o largamente usado phpmyadmin, para o Mysql. Não seria diferente para o MongoDB,existem diversos sistemas desses nas mais variadas linguagens, uma boa listagem seencontra em http://www.mongodb.org/display/DOCS/Admin+UIsAdminUIs para PHP:PhpMoAdmin - http://www.phpmoadmin.com/RockMongo - http://code.google.com/p/rock-php/wiki/rock_mongo
  44. 44. MongoDB - PHPMoAdminhttp://www.phpmoadmin.com/
  45. 45. MongoDB - RockMongohttp://rockmongo.com/Para se logar use login e senha: admin.
  46. 46. MongoDB - RockMongohttp://rockmongo.com/Para se logar use login e senha: admin.
  47. 47. MongoDB - FrameworksVários frameworks e CMS de PHP já possuem um biblioteca para trabalhar com o MongoDB,dentre eles posso listar:CakePHP:https://github.com/ichikaway/cakephp-mongodbCodeigniter:https://github.com/kyledye/MongoDB-CodeIgniter-DriverFatFreehttp://fatfree.sourceforge.net/page/data-mappersKohanahttps://github.com/Wouterrr/mangodbLithiumhttp://lithify.me/docs/lithium/data/source/MongoDb
  48. 48. MongoDB - FrameworksSymfony 2 :http://code.google.com/p/mongodbloganalyzer/http://www.symfony-project.org/plugins/sfStoragePerformancePluginhttps://github.com/brtriver/sfMongoSessionStorageYiihttp://canni.github.com/YiiMongoDbSuite/Zend Frameworkhttps://github.com/coen-hyde/Shanty-Mongohttps://github.com/stunti/Stunti_Cache_Backend_Mongohttp://framework.zend.com/wiki/display/ZFPROP/Zend_Nosql_Mongo+-+Valentin+GolevDrupal:http://drupal.org/project/mongodb
  49. 49. MongoDB - HostsExistem alguns serviços onde você pode hospedar bancos MongoDB:MongoHQ - https://mongohq.com/HostedMongo - http://hostedmongo.com/MongoLab - https://mongolab.com/home/MongoGrid - http://nodegrid.com/resources/mongogrid/
  50. 50. Map/ReduceO map/reduce foi um framework desenvolvido pelo Google para iterar em grandes coleçõesde dados paralelamente. Baseado nas funções de map e reduce da programação funcional.A ideia é mapear seus dados através de suas coleções e depois reduzir esses dados emuma informação.db.collection.mapReduce(mapfunction,reducefunction[,options]);m = function() { emit(this.user_id, 1);r = function(k,vals) { return 1; }res = db.posts.mapReduce(m, r, { query : {tag:php} });db[res.result].find()
  51. 51. Map/Reduce//map function() { emit( this.username, {count: 1, likes: this.likes} ); }//reduce function(key, values) { var result = {count: 0, likes: 0}; values.forEach(function(value) { result.count += value.count; result.likes += value.likes; }); return result; }
  52. 52. Map/ReduceFazer o exemplo 2: http://www.mongodb.org/display/DOCS/MapReduce
  53. 53. MongoDB - Códigos
  54. 54. MongoDB - Conexão$conexao = new Mongo();$db = $conexao->$nome_banco;$collection = $db->$nome_collection;
  55. 55. MongoDB - Exemplos PHPINSERT INTO USERS VALUES(1,1)$db->users->insert(array("a" => 1, "b" => 1));SELECT a,b FROM users$db->users->find(array(), array("a" => 1, "b" => 1));SELECT * FROM users WHERE age=33$db->users->find(array("age" => 33));SELECT a,b FROM users WHERE age=33$db->users->find(array("age" => 33), array("a" => 1, "b" => 1));SELECT a,b FROM users WHERE age=33$db->users->find(array("age" => 33), array("a" => 1, "b" => 1));SELECT a,b FROM users WHERE age=33 ORDER BY name$db->users->find(array("age" => 33), array("a" => 1, "b" => 1))->sort(array("name" => 1));
  56. 56. MongoDB - Exemplos PHPSELECT * FROM users WHERE age>33$db->users->find(array("age" => array($gt => 33)));SELECT * FROM users WHERE age<33 <br />$db->users->find(array("age" => array($lt => 33)));SELECT * FROM users WHERE name LIKE "%Joe%"$db->users->find(array("name" => new MongoRegex("/Joe/")));SELECT * FROM users WHERE name LIKE "Joe%"$db->users->find(array("name" => new MongoRegex("/^Joe/")));SELECT * FROM users WHERE age>33 AND age<=40$db->users->find(array("age" => array($gt => 33, $lte => 40)));
  57. 57. MongoDB - Exemplos PHPSELECT * FROM users ORDER BY name DESC$db->users->find()->sort(array("name" => -1));CREATE INDEX myindexname ON users(name)$db->users->ensureIndex(array("name" => 1));CREATE INDEX myindexname ON users(name,ts DESC)$db->users->ensureIndex(array("name" => 1, "ts" => -1));SELECT * FROM users WHERE a=1 and b=q$db->users->find(array("a" => 1, "b" => "q"));SELECT * FROM users LIMIT 10 SKIP 20$db->users->find()->limit(10)->skip(20);SELECT * FROM users WHERE a=1 or b=2$db->users->find(array($or => array(array("a" => 1), array("b" => 2))));
  58. 58. MongoDB - Exemplos PHPSELECT * FROM users LIMIT 1$db->users->find()->limit(1);EXPLAIN SELECT * FROM users WHERE z=3$db->users->find(array("z" => 3))->explain()SELECT DISTINCT last_name FROM users$db->command(array("distinct" => "users", "key" => "last_name"));SELECT COUNT(*) FROM users$db->users->count();SELECT COUNT(*) FROM users where AGE > 30$db->users->find(array("age" => array($gt => 30)))->count();
  59. 59. MongoDB - Exemplos PHPSELECT COUNT(AGE) from users$db->users->find(array("age" => array($exists => true)))->count();UPDATE users SET a=1 WHERE b=q$db->users->update(array("b" => "q"), array($set => array("a" => 1)));UPDATE users SET a=a+2 WHERE b=q$db->users->update(array("b" => "q"), array($inc => array("a" => 2)));DELETE FROM users WHERE z="abc"$db->users->remove(array("z" => "abc"));
  60. 60. MongoDB - Tarefa

×