Curso mongo db com php

61
MongoDB com PHP Jean Carlo Nascimento aka Suissa

description

 

Transcript of Curso mongo db com php

Page 1: Curso mongo db com php

MongoDB com PHPJean Carlo Nascimento aka Suissa

Page 3: Curso mongo db com php

Introdução

Page 4: Curso mongo db com php

NoSQLPor que usar?

Page 5: Curso mongo db com php

NoSQLOnde usar?

Page 6: Curso mongo db com php

NoSQLTipos de armazenamento?

Page 7: Curso mongo db com php

Key/Value StoreEsse é 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 DBTokyo CabinetKyoto CabinetProject VoldermortMemcacheDBSimpleBDRedisRiak

Page 8: Curso mongo db com php

Wide Column StoreFortemente 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)HiperTableCassandra(Apache)

Page 9: Curso mongo db com php

Document StoreBaseado em documentos XML ou JSON, podem ser localizados pelo seu id unico ou por qualquer registro que tenha no documento.

CouchDB(Apache)MongoDBRavenDB

Page 10: Curso mongo db com php

Graph StoreCom 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.

TitanNeo4JInfoGridHyperGraphDB

Page 11: Curso mongo db com php

Column Oriented StoreEsses 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.

VerticaMonetDBLucidDBInfobrightIngres/Vectorwise

Page 12: Curso mongo db com php
Page 13: Curso mongo db com php

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

Page 14: Curso mongo db com php

Cases ReaisPara 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

Page 15: Curso mongo db com php

Cases Reais● MTV Networks

● GitHub

● Justin.tv

● CollegeHumor

● SugarCRM

● GrooveShark

● CartolaFC

http://www.mongodb.org/display/DOCS/Use+Cases

Page 16: Curso mongo db com php

MongoDB● C++

● JSON/BSON

● Replica

● Sharding

● GridFS

● Map/Reduce

Page 17: Curso mongo db com php

MongoDB - Instalação● Mac

● Linux

● Windows

Page 18: Curso mongo db com php

MongoDB - TerminologiaSQL RDBMS

DATABASE

TABLE

ROWS

QUERY

INDEX

PARTITION

MongoDB

DATABASE

COLLECTION

JSON

DOCUMENT

QUERY

INDEXSHARD

Page 19: Curso mongo db com php

MongoDB - Coleçãouse minha_database

show dbs

db.nome_da_collection.comando()

Ex.:db.nome_da_collection.drop() //apaga coleção

db.nome_da_collection.remove() //limpa coleção

Page 20: Curso mongo db com php

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

Page 21: Curso mongo db com php

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 } );

Page 22: Curso mongo db com php

MongoDB - Operadores$lt - menor que <

$lte - menor ou igual que <=

$gt - maior que >

$gte - maior ou igual que >=

Page 23: Curso mongo db com php

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

Page 24: Curso mongo db com php

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

Page 25: Curso mongo db com php

MongoDB - Countselect count(*) from professoresdb.professores.count()

select count(*) from professores where idade > 30db.professores.count({idade:{$lt: 30}})

Page 26: Curso mongo db com php

MongoDB - Ordenaçãoselect * 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})

Page 27: Curso mongo db com php

MongoDB - Limitselect * from professores order by nome ASC limit 0,2 db.professores.find().sort({nome:1}).limit(2)

select * from professores limit 2 offset 10db.professores.find().limit(2).skip(10)

Page 28: Curso mongo db com php

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

Page 29: Curso mongo db com php

MongoDB - Exclusãodb.professores.remove(); // exclui tudodb.things.remove({nome: "Jean"}); // exclui todos os registro com nome = Jean

Page 30: Curso mongo db com php

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()

Page 31: Curso mongo db com php

Sharding - O que éSharding é a divisão da informação em partes iguais e divididas entre os nós.

Page 32: Curso mongo db com php

Sharding - Como funcionaO MondoDB ira dividir nossas informações através dos servidores de sharding setados em sua configuração, levando em conta a shard key.

Page 33: Curso mongo db com php

Sharding - ConfigurandoPrimeiramente 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.

Page 34: Curso mongo db com php

Sharding - ConfigurandoVamos 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

Page 35: Curso mongo db com php

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 }

Page 36: Curso mongo db com php

Sharding - PHP$mongo->selectDB('admin')->command(array('addshard'=>'hostname:port'));

Page 37: Curso mongo db com php

MongoDB - GridFSGridFS é o sistema de arquivos do MongoDb e deve ser usado quando precisamos armazenar arquivos maiores que 1Mb.

mongofiles -d myfiles put my_music.mp3connected to: 127.0.0.1

added file: { _id: ObjectId('4ce9ddcb45d74ecaa7f5a029'), filename: "my_music.mp3", chunkSize: 262144, uploadDate: new Date(1290395084166), md5: "7872291d4e67ae8b8bf7aea489ab52c1", length: 1419631 }

Page 38: Curso mongo db com php

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

Page 39: Curso mongo db com php

MongoDB - GridFS - inserindoMais exemplos em: http://blog.hardkap.com/index.php/posts/00069/MongoDB---GridFS

Page 40: Curso mongo db com php

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);

Page 41: Curso mongo db com php

MongoDB - DBRefDBRef é 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.

Page 42: Curso mongo db com php

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") )

Page 43: Curso mongo db com php

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 ()

Page 44: Curso mongo db com php

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 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

Page 45: Curso mongo db com php

MongoDB - PHPMoAdminhttp://www.phpmoadmin.com/

Page 46: Curso mongo db com php

MongoDB - RockMongohttp://rockmongo.com/

Para se logar use login e senha: admin.

Page 47: Curso mongo db com php

MongoDB - RockMongohttp://rockmongo.com/

Para se logar use login e senha: admin.

Page 48: Curso mongo db com php

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-mongodb

Codeigniter:https://github.com/kyledye/MongoDB-CodeIgniter-Driver

FatFreehttp://fatfree.sourceforge.net/page/data-mappers

Kohanahttps://github.com/Wouterrr/mangodb

Lithiumhttp://lithify.me/docs/lithium/data/source/MongoDb

Page 49: Curso mongo db com php

MongoDB - FrameworksSymfony 2 :http://code.google.com/p/mongodbloganalyzer/http://www.symfony-project.org/plugins/sfStoragePerformancePluginhttps://github.com/brtriver/sfMongoSessionStorage

Yiihttp://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+Golev

Drupal:http://drupal.org/project/mongodb

Page 50: Curso mongo db com php

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/

Page 51: Curso mongo db com php

Map/ReduceO 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()

Page 52: Curso mongo db com php

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; }

Page 53: Curso mongo db com php

Map/ReduceFazer o exemplo 2: http://www.mongodb.org/display/DOCS/MapReduce

Page 54: Curso mongo db com php

MongoDB - Códigos

Page 55: Curso mongo db com php

MongoDB - Conexão$conexao = new Mongo();$db = $conexao->$nome_banco;$collection = $db->$nome_collection;

Page 56: Curso mongo db com php

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));

Page 57: Curso mongo db com php

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)));

Page 58: Curso mongo db com php

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))));

Page 59: Curso mongo db com php

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();

Page 60: Curso mongo db com php

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"));

Page 61: Curso mongo db com php

MongoDB - Tarefa