1) O documento apresenta uma introdução sobre MongoDB com PHP, incluindo links relevantes e casos de uso de empresas que utilizam MongoDB em produção.
2) É descrito os principais tipos de bancos de dados NoSQL (key-value stores, wide column stores, document stores, graph stores e column oriented stores), com exemplos de cada um.
3) São apresentados comandos e conceitos básicos para trabalhar com MongoDB via PHP, como conexão, inserção, consulta, alteração e exclusão de dados.
7. 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
8. 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)
9. 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
10. 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
11. 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
12.
13. 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
14. 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
19. MongoDB - Coleção
use 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
20. 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
21. 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 } );
22. MongoDB - Operadores
$lt - menor que <
$lte - menor ou igual que <=
$gt - maior que >
$gte - maior ou igual que >=
23. 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
24. 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
25. MongoDB - Count
select count(*) from professores
db.professores.count()
select count(*) from professores where idade > 30
db.professores.count({idade:{$lt: 30}})
26. 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})
27. 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)
28. 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
30. 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()
31. Sharding - O que é
Sharding é a divisão da informação em partes iguais e divididas entre os nós.
32. 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.
33. 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.
37. 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 }
38. 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
39. MongoDB - GridFS - inserindo
Mais exemplos em: http://blog.hardkap.com/index.php/posts/00069/MongoDB---GridFS
40. 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);
41. 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.
42. 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") )
44. 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
48. 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
50. 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/
51. 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()
56. 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));
57. 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)));
58. 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))));
59. 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();
60. 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"));