$30 off During Our Annual Pro Sale. View Details »

Curso de MongoDB com PHP

Curso de MongoDB com PHP

Curso de MongoDB com PHP dado na School of Net em Julho.

Jean Carlo Nascimento

July 03, 2012
Tweet

Other Decks in Technology

Transcript

  1. Key/Value Store Esse é o tipo de banco de dados

    NoSQL mais simples o conceito dele é uma chave e um valor para essa chave, mas ele é o que aguenta mais carga de dados. Esses tipos de bancos de dados, são o que tem a maior escalabilidade. Berkeley DB Tokyo Cabinet Kyoto Cabinet Project Voldermort MemcacheDB SimpleBD Redis Riak
  2. Wide Column Store Fortemente inspirados pelo BigTable do Google eles

    suportam várias linhas e colunas, alem disso ele permite subcolunas. Alem do BigTable do google outros que usam essa tecnologia são: HBase(Apache) HiperTable Cassandra(Apache)
  3. Document Store Baseado em documentos XML ou JSON, podem ser

    localizados pelo seu id unico ou por qualquer registro que tenha no documento. CouchDB(Apache) MongoDB RavenDB
  4. Graph Store Com uma complexibilidade maior esses bancos de dados

    guardam objetos e não registros como os outros tipos de NoSQL. A busca destes itens são feitas pela navegação destes objetos. Titan Neo4J InfoGrid HyperGraphDB
  5. Column Oriented Store Esses são bancos de dados relacionais, porem

    eles tem caracteristicas do NoSQL a principal diferença deles é que os dados são armazenados em colunas, ajudando na escalabilidade. Vertica MonetDB LucidDB Infobright Ingres/Vectorwise
  6. Cases Reais Um case real interessante é da Netflix que

    utiliza 3 bancos NoSQL: SimpleDB, HBase e Cassandra. http://techblog.netflix.com/2011/01/nosql-at-netflix.html
  7. Cases Reais Para o MongoDB que será nosso banco de

    estudo temos as seguintes empresas utilizando-o em produção: • SAP • Craigslist • Shutterfly • foursquare • bit.ly • SourceForge • Disney
  8. Cases Reais • MTV Networks • GitHub • Justin.tv •

    CollegeHumor • SugarCRM • GrooveShark • CartolaFC http://www.mongodb.org/display/DOCS/Use+Cases
  9. MongoDB - Terminologia SQL RDBMS DATABASE TABLE ROWS QUERY INDEX

    PARTITION MongoDB DATABASE COLLECTION JSON DOCUMENT QUERY INDEXSHARD
  10. MongoDB - Inserção prof1 = {"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
  11. MongoDB - Consulta db.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 professores db.professores.find(null, {nome:1, idade:1} ) select nome, idade from professores where apelido = "suissa" db.professores.find( { apelido : "suissa" }, { nome:1, idade:1 } );
  12. MongoDB - Operadores $lt - menor que < $lte -

    menor ou igual que <= $gt - maior que > $gte - maior ou igual que >=
  13. 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 dos tipos e seus valores acesse: Lista dos tipos e seus valores
  14. 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
  15. MongoDB - Count select count(*) from professores db.professores.count() select count(*)

    from professores where idade > 30 db.professores.count({idade:{$lt: 30}})
  16. MongoDB - Ordenação select * from professores order by nome

    ASC db.professores.find().sort({nome:1}) select * from professores order by idade DESC db.professores.find().sort({idade:-1})
  17. MongoDB - Limit select * from professores order by nome

    ASC limit 0,2 db.professores.find().sort({nome:1}).limit(2) select * from professores limit 2 offset 10 db.professores.find().limit(2).skip(10)
  18. MongoDB - Alteração professor = 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
  19. MongoDB - Índices Para 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()
  20. Sharding - O que é Sharding é a divisão da

    informação em partes iguais e divididas entre os nós.
  21. Sharding - Como funciona O MondoDB ira dividir nossas informações

    através dos servidores de sharding setados em sua configuração, levando em conta a shard key.
  22. Sharding - Configurando Primeiramente precisamos criar os serviços de sharding.

    Esse exemplo é apenas didático e será rodado em apenas um servidor. mkdir /data/db/a /data/db/b mongod --shardsvr --dbpath /data/db/a --port 10000 > /tmp/sharda.log & cat /tmp/sharda.log mongod --shardsvr --dbpath /data/db/b --port 10001 > /tmp/shardb.log & cat /tmp/shardb.log Obs.: O cat serve apenas para verificarmos se o serviço subiu realmente e o & serve para rodar em background.
  23. Sharding - Configurando Vamos configurar os servidores. mkdir /data/db/config mongod

    --configsvr --dbpath /data/db/config --port 20000 > /tmp/configdb.log & cat /tmp/configdb.log mongos --configdb localhost:20000 > /tmp/mongos.log & cat /tmp/mongos.log
  24. Sharding - Configurando Precisamos 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 }
  25. MongoDB - GridFS GridFS é o sistema de arquivos do

    MongoDb e deve ser usado quando precisamos armazenar arquivos maiores que 1Mb. mongofiles -d myfiles put my_music.mp3 connected to: 127.0.0.1 added file: { _id: ObjectId('4ce9ddcb45d74ecaa7f5a029'), filename: "my_music.mp3", chunkSize: 262144, uploadDate: new Date(1290395084166), md5: "7872291d4e67ae8b8bf7aea489ab52c1", length: 1419631 }
  26. 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
  27. 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);
  28. MongoDB - DBRef DBRef é o esquema nativo de referencia

    interna entre os documentos. O driver do PHP executará a query no objeto desejada, trazendo os objetos referenciados via DBRef diretamente.
  29. MongoDB - DBRef DBRefs 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") )
  30. MongoDB - DBRef Inserir 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 ()
  31. MongoDB - Admin UIs Sistemas 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 se encontra em http://www.mongodb.org/display/DOCS/Admin+UIs AdminUIs para PHP: PhpMoAdmin - http://www.phpmoadmin.com/ RockMongo - http://code.google.com/p/rock-php/wiki/rock_mongo
  32. MongoDB - Frameworks Vá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-mongodb Codeigniter: https://github.com/kyledye/MongoDB-CodeIgniter-Driver FatFree http://fatfree.sourceforge.net/page/data-mappers Kohana https://github.com/Wouterrr/mangodb Lithium http://lithify.me/docs/lithium/data/source/MongoDb
  33. MongoDB - Frameworks Symfony 2 : http://code.google.com/p/mongodbloganalyzer/ http://www.symfony-project.org/plugins/sfStoragePerformancePlugin https://github.com/brtriver/sfMongoSessionStorage Yii

    http://canni.github.com/YiiMongoDbSuite/ Zend Framework https://github.com/coen-hyde/Shanty-Mongo https://github.com/stunti/Stunti_Cache_Backend_Mongo http://framework.zend.com/wiki/display/ZFPROP/Zend_Nosql_Mongo+-+Valentin+Golev Drupal: http://drupal.org/project/mongodb
  34. MongoDB - Hosts Existem 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/
  35. Map/Reduce O map/reduce foi um framework desenvolvido pelo Google para

    iterar em grandes coleções de 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 em uma 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()
  36. 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; }
  37. MongoDB - Exemplos PHP INSERT 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));
  38. MongoDB - Exemplos PHP SELECT * 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)));
  39. MongoDB - Exemplos PHP SELECT * 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))));
  40. MongoDB - Exemplos PHP SELECT * 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();
  41. MongoDB - Exemplos PHP SELECT 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"));