Curso mongo db com php

Post on 20-Jan-2015

4.006 views 0 download

description

 

Transcript of Curso mongo db com php

MongoDB com PHPJean Carlo Nascimento aka Suissa

Introdução

NoSQLPor que usar?

NoSQLOnde usar?

NoSQLTipos de armazenamento?

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

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)

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

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

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

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

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

Cases Reais● MTV Networks

● GitHub

● Justin.tv

● CollegeHumor

● SugarCRM

● GrooveShark

● CartolaFC

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

MongoDB● C++

● JSON/BSON

● Replica

● Sharding

● GridFS

● Map/Reduce

MongoDB - Instalação● Mac

● Linux

● Windows

MongoDB - TerminologiaSQL RDBMS

DATABASE

TABLE

ROWS

QUERY

INDEX

PARTITION

MongoDB

DATABASE

COLLECTION

JSON

DOCUMENT

QUERY

INDEXSHARD

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

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

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

MongoDB - Operadores$lt - menor que <

$lte - menor ou igual que <=

$gt - maior que >

$gte - maior ou igual que >=

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

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

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

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

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

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)

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

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

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

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

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.

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.

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

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 }

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

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 }

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

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

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

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.

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

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

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

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

MongoDB - RockMongohttp://rockmongo.com/

Para se logar use login e senha: admin.

MongoDB - RockMongohttp://rockmongo.com/

Para se logar use login e senha: admin.

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

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

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/

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

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

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

MongoDB - Códigos

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

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

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

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

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

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

MongoDB - Tarefa