SlideShare ist ein Scribd-Unternehmen logo
1 von 91
Apresentação:
Ari Stopassola Junior
@stopassola
Bacharel em Informática com ênfase em Análise de
Sistemas pela Unisinos, cursou mestrado em Engenharia
Informática e de Computadores pelo Instituto Superior
Técnico da Universidade Técnica de Lisboa (Portugal),
perito judicial ad hoc especializado em TI (mantenedor do
site PERITO.inf.br), Zend Certified Engineer (PHP 5.3) e
Zend Certified PHP Engineer (PHP 5.5) #ZEND004019,
Certified ScrumMaster pela Scrum Alliance #203613,
Microsoft Certified Professional (MCP), idealizador do
projeto Certificamp, consultor web e PHP evangelist.
Ari Stopassola Junior
Roadmap
• conceito de bases de dados
NoSQL
• cases
• comparações com o
modelo relacional
• expressões SQL x
MongoDB (orientado à
documentos)
• instalação
• recursos do MongoDB
• operações via console
• modelagem: embedded,
manual e DBRef
• driver PHP
• anatomia do código PHP
• CRUD (Create, Read,
Update and Delete)
• ObjectId
• operadores
• segurança
• persistência de objetos
• tratamento arrays
(documentos aninhados)
• índices (performance)
• projeção
• hospedagem (PaaS)
• novidades da versão 3
• ferramentas de
administração
• programa de certificação
NoSQL
• Not Only SQL (poderia ser NOSQL)
• Movimento de bancos de dados não
relacionais
• Também chamados: Modelo Relacional
Não Normalizado (MRNN)
• Seria mais apropriado dizer então “No
relational” pois alguns SGBDs possuem
interface SQL, embora sejam
categorizados como NoSQL. Ex.:
OrientDB
Taxonomia das bases NoSQL
• Documento (XML ou JSON)
– RavenDB, CouchDB, MongoDB
• Orientado a Objetos
– Db4o
• Chave/Valor (Key/Value)
– Redis, SimpleDB, Hbase, MemcacheDB, Riak, Berkeley DB
• Tabular (inspirado no BigTable do Google)
– Cassandra (Apache), Hypertable, Hbase
• Orientado a colunas (relacionais com características
NoSQL)
– Vertica, MonetDB, LucidDB, Infobright
• Grafos (Graph)
– Neo4j, OrientDB, Titan, DEX, InfiniteGraph, InfoGrid,
HyperGraphDB
• Outros
– Chordless, Mnesia Fonte: http://pt.wikipedia.org/wiki/NoSQL
Quem usa NoSQL?
• eBay (pioneiro)
• New York Times
• Foursquare
• Electronic Arts
• GitHub
• SAP
• Disney
• Twitter
“Fifteen months ago, It took two weeks to perform
ALTER TABLE on the statuses [tweets] table.”
(setembro/2010)
Fonte: http://www.mongodb.org/about/production-deployments/
• Responsável por 438 casamentos ao dia nos
EUA
• Algoritmo “Compatibility Matching System”
reduz significativamente o número de
separações
• +51 milhões de usuários
• Processa 1 bilhão de combinações de casais
• Sob RDBMS demorava 2 semanas
processando
Fonte:
http://www.mongodb.com/press/mongodb-powers-critical-eharmony-compatibility-application-processing-1-billion-matches-dail-0
http://www.mongodb.com/presentations/big-dating-eharmony
Base orientada a documentos
Fonte: livro “MongoDB and PHP” de Steve Francia publicado pela O’Reilly
Por quê?
• Sistemas Orientados à Objetos
requer ORM (Object-Relational
Mapping)
• Normalização precisa de JOINs
• Complexidade dos relacionamentos
• Problemas ao escalar:
vertical versus horizontal
Sharding: escalabilidade
Horizontalmente escalável
A
LT
W
Índice “C”
A
LT
W
F
Y
U
P
K
S
V
Z
Replica set: redundância
Diagrama ER do
catálogo de produtos
do Magento
Modelagem relacional
Modelagem
Orientada a
Documentos
Organização
interna
AMP
MongoDB
http://www.mongodb.org
• Nome vem da expressão huMONGOus
que significa “extremamente enorme”
• Banco de dados open source:
https://github.com/mongodb/
• Criado pela 10gen em C++, orientado a
documentos (formato JSON/BSON)
• Escalável
• Schemaless (não há colunas ou tipos de
dados)
JavaScript Object Notation
Expressões SQL em
MongoDB
SQL MongoDB
Database Database
Table Collection
Index Index
Row Document
Column Field
Joining Embedding & linking
Partition Shard
Fonte: “Reference Cards for MongoDB”
Hierarquia
• Bancos de dados armazenam coleções
• Coleções possuem documentos
• No contexto PHP, documentos são arrays
multidimensionais
• Do ponto de vista do MongoDB, são
estruturas em JSON: Imagem extraída de: http://habrahabr.ru/post/156633
Ready, set…
GO!
Instalação manual: OSX e Linux
1) Baixe o binário do MongoDB em http://www.mongodb.org/downloads
Descompacte o arquivo mongodb-osx-x86_64-2.x.x.tgz
2) Renomeie o diretório (resultado da descompactação) para um nome mais
apropriada. Ex.: mongodb
3) Abra o terminal e adicione ao final do arquivo /etc/paths o caminho:
sudo vim /etc/paths
Adicione a linha (de acordo com o diretório onde o MongoDB se encontra).
Ex.: /Users/ari/mongodb/bin
echo "export PATH=$PATH:/Users/ari/mongodb/bin" > ~/.bash_profile
4) Crie diretórios para armazenar as bases. O binário disponibilizado pela
10gen prevê que a base ficará na raiz do sistema operacional:
sudo mkdir -p /data/db/
sudo chown `id -u` /data/db
5) Inicie o serviço (deamon):
./mongod &
6) Abra a console do MongoDB e realize um teste:
mongo
> db.passeios.save( { a : 1 } )
> db.passeios.find()
sudo ./mongod & (dependendo das permissões de usuário)
Método alternativo ao passo 3
Instalação: Windows
• Download (certifique-se da arquitetura: 32 ou
64bit)
• Descomprimir no C:mongodb-win32-i386-2.x.x
• Renomear a pasta para C:mongodb
• Abra o terminal como usuário Administrador
• Crie o diretório c:datadb
cd ....
md data
md datadb
• Execute o deamon do MongoDB:
c:mongodbbinmongod.exe
• Em outra console execute o client:
c:mongodbbinmongo.exe
Fonte: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/
Driver para PHP
https://github.com/mongodb/mongo-php-driver
• Mantido por Derick Rethans (autor do
xDebug e vários outros projetos
significativos):
http://derickrethans.nl
• http://docs.mongodb.org/ecosystem/drivers/p
hp/
Foto: http://steve.maraspin.net/photo/gallery/conferences/2012-phpday-verona-italy/
Instalação do driver PHP para mongoDB
http://pecl.php.net/package/mongo
# sudo pecl install mongo
Adicione a linha extension=mongo.so no php.ini
http://soupforthegirlysoul.blogspot.com.br/2012/03/sunday-smiles-optimism-opportunists-and.html
Habilite a extensão PHP no
ZendServer CE
Verifique se o módulo foi
habilitado: phpinfo()
Documentação antiga
• A partir da versão 1.3.0 do driver, Derick
Rethans mudou o nome da classe de
Mongo para MongoClient
• Mais detalhes no post institulado
“Mongo is dead, long live
MongoClient”:http://derickrethans.nl/mong
oclient.html
phpMoAdmin
1. Acesse:
http://www.phpmoadmin.com/
2. Faça o download do phpmoadmin.zip,
descomprima e copie o script
moadmin.php para a raiz do Apache –
coloque uma autenticação (caso deseje)
Anatomia do código PHP
<?php
$conexao = new MongoClient();
$db = $conexao->nomebase;
$clientes = array(
'nome' => "Ari Stopassola Junior",
'endereco'=> "Estrada do Carazal, 3744",
'cidade' => "Gramado"
);
$colecao = $db->clientes;
$colecao->insert($clientes);
$elementos = $colecao->find( array('cidade' => 'Gramado'));
foreach ($elementos as $obj) {
echo $obj['endereco']."<br>";
}
?>
Conexão
//Conecta em localhost:27017
$conexao = new MongoClient();
//Conecta no host remoto na porta default
$conexao = new MongoClient("200.248.240.62");
//Host remoto na porta especificada
$conexao = new MongoClient("exemplo.com:65432");
$conexao = new MongoClient("localhost:27017",
array("username" => "root", "password" =>
"senha"));
Conexão (mais elegante)
try {
$conexao = new MongoClient();
}
catch (MongoConnectionException $e){
die($e->getMessage());
}
Base de dados
$db = $conexao->nomebase;
//Formato alternativo
$db = $conexao->selectDB('nomebase');
ATENÇÃO: se a base não existir, ela será
criada, portanto certifique-se bem do nome da
base.
Coleção
//Faz referência a coleção
$colecao = $db->clientes;
//Formato direto, partindo da conexão
$colecao = $conexao->nomebase->clientes;
//Formato alternativo
$colecao = $db->selectCollection('clientes');
Inserção
Documento == Array PHP
$clientes = array(
'nome' => "Ari Stopassola Junior",
'endereco'=> "Estrada do Carazal, 3744",
'cidade' => "Gramado",
'UF' => "Rio Grande do Sul",
'CEP' => "95670-000"
);
$colecao->insert($clientes);
Inserção: documento dentro de
documento$passeio = array(
"nome" => "Raízes Coloniais",
"valor" => 90,
"opcionais” => array("almoco" => true, "transfer" => true),
"observacoes" => "Senhor obeso, portanto reserve dois assentos",
"data" => new MongoDate()
);
db.passeios.insert({
"nome": "Itaimbezinho",
"valor": 120,
"opcionais": [
{
"almoco": false,
"transfer": true,
"observacoes": "Vai a família toda"
}
],
"observacoes": "já foi pago",
"data": new Date()
})
Sob o ponto de vista relacional,
não seria possível inserir um
array no campo “opcionais”.
Seria necessário uma nova
tabela (provavelmente até uma
terceira tabela, dependendo do
nível de normalização) para que
isso fosse viável – sendo
imprescindível o uso de JOINS
Dot notation
db.voucher.find({
'pacotes.passeios.nome': "Tour Uva e Vinho”})
What’s happening?!
• Não criamos a base de dados
• Não utilizamos cláusulas SQL como :
CREATE TABLE, auto_increment,
PRIMARY KEY, INDEX etc
• Não utilizamos ALTER TABLE para
adicionar novos campos
• Não foi necessário aplicar JOINS entre
entidades
• Nada de PDO, ORM ou bibliotecas externas
Modelagem
• Quando a entidade tornar-se muito grande,
pode-se quebrá-la em mais coleções
• Mantém o ObjectID como referência
• Esse link deve ser criado manualmente
Relação "UM para UM"
(abordagem manual)
Relação "UM para UM" manual
(definição de classes)<?php
class Servico{
public $_id;
public $nome;
public $datahora;
public function __construct($i, $n, DateTime $d){
$this->_id = $i;
$this->nome = $n;
$this->datahora = $d;
}
}
class NotaFiscal{
public $servico_id;
const emitente = "Empresa Ltda";
public $danfe;
public $valor;
public function __construct($s_id, $d, $v){
$this->servico_id= $s_id;
$this->danfe = $d;
$this->valor = $v;
}
}
Faço o encadeamento
manualmente
$conexao = new MongoClient(); //Conecta no mongoDB
$db = $conexao->turismo; //Escolhe a base de dados
$servicos = $db->servicos; //Escolhe a coleção
$notasfiscais = $db->notasfiscais; //Escolhe a coleção
//Gero um ObjectID, para que eu possa fazer o encadeamento depois
$serv[] = new Servico(new MongoID(), "Tour Uva e Vinho", new DateTime);
$serv[] = new Servico(new MongoID(), "Itaimbezinho", new DateTime);
$servicos->batchInsert($serv);
//O ObjectID será criado implicitamente
$nf[] = new NotaFiscal($serv[0]->_id->__toString(), "12.34", 89);
$nf[] = new NotaFiscal($serv[1]->_id->__toString(), "56.78", 152.50);
$notasfiscais->batchInsert($nf);
//Localiza um servico
$servico = $servicos->findOne(array('nome' => 'Itaimbezinho'));
$notafiscal = $notasfiscais->findOne(array('servico_id' => $servico['_id']-
>__toString()));
DBRefs: Data Base
References
• Convenção para representar um
documento de outra coleção
• Forma mais elegante de relacionar
coleções
• A abordagem manual funciona bem com
dois ou três documentos vinculados. Caso
necessite associar múltiplas coleções,
considere usar DBRef
• Alerta: nem toda linguagem suporta esse
recurso (PHP possui!)
<?php
class EmpresaParceira{
public $_id;
public $nome;
public $endereco;
public function __construct($i, $n, $e){
$this->_id = $i;
$this->nome = $n;
$this->endereco = $e;
}
}
class Colaborador{
public $nome;
public $empresa;
public function __construct($n, $e){
$this->nome = $n;
$this->empresa = $e;
}
}
Relação "UM para UM" em DBRef
Definição de classes
Referenciando
//Gero um ObjectID, para que eu possa referenciar depois
$empr[] = new EmpresaParceira(new MongoID(), "AEREA", "Dom Pedro II, 90");
$empr[] = new EmpresaParceira(new MongoID(), "VillaBella", "Av. VillaBella");
$empresas->batchInsert($empr);
//Exemplo via console (JavaScript)
//var id = new ObjectId('548b3f4bb7f83aa35a0041a8'); //id do VillaBella
//db.colaboradores.insert({nome: 'Diego Rossi', empresa: {'$ref':'empresas',
'$id':id, '$db':'turismo'}});
//O ObjectID será criado implicitamente
$colab[]= new Colaborador("Cleyton Arghiropol", MongoDBRef::create("empresas",
$empr[0]->_id, "turismo"));
$colab[]= new Colaborador("Paloma Santiago", MongoDBRef::create("empresas",
$empr[1]->_id, "turismo"));
$colaboradores->batchInsert($colab);
$colaborador = $colaboradores->findOne(array('nome' => 'Paloma Santiago'));
print_r($colaborador);
$ref (Coleção)
$id (ObjectID)
$db (Banco de dados opcional)
Consultando: método getDBRef
//Localiza um colaborador e obtém a empresa parceira, através de DBRef
$colaborador = $colaboradores->findOne(array('nome' => 'Paloma Santiago'));
$empresa = $colaboradores->getDBRef($colaborador['empresa']);
batchInsert
$anuncios[] = array(
'nome' => 'iPod',
'modelo' => 'Touch',
'capacidade' => '16Gb',
);
$anuncios[] = array(
'nome' => 'Airport Express',
'specs' => array('AirPlay', 'dual band')
);
$anuncios[] = array(
'nome' => 'iBook',
'modelo' => 'Clamshell',
'CPU' => 'G3 366 Mhz',
'specs' => array('Airport', 'fonte YoYo')
);
$colecao->batchInsert($anuncios);
Consulta
//Busca TODOS
$elementos = $colecao->find();
foreach ($elementos as $objeto) {
echo $objeto['endereco']."n";
}
//Filtra por alguma característica
$elementos = $colecao->find(array('cidade'=>'Gramado'));
find versus findone
findone retorna um objeto do tipo MongoId
print_r($resultado);
find retorna um objeto do tipo MongoCursor
foreach($resultado as $item) {
print_r($item);
}
http://php.net/manual/pt_BR/class.mongoid.php
http://php.net/manual/pt_BR/class.mongocursor.php
requer iteração
ObjectId
(equivalente a PK)
• Cada documento (registro) recebe um
código único e imutável, chamado
ObjectId
• Esse identificador baseia-se no momento
em que a inserção foi realizada, em
conjunto com o nome do host,
concatenado ao PID (process ID) do
servidor e um número aleatório
> db.passeios.find()[0]
> db.passeios.find()[0]._id
> db.passeios.find()[0]._id.getTimestamp()
ISODate("2013-06-07T20:07:26Z")
ObjectID
$id = new MongoId('54526904b7f83ac71d0041a7');
$resultado = $colecao->findone(array('_id' => $id));
print_r($resultado);
$id = '54526904b7f83ac71d0041a7';
$resultado = $colecao->findone(array('_id' => $id));
print_r($resultado);
✓
✗
Como referenciar um ObjectId
> new ObjectId
ObjectId("51b278e1fc431ab4f7484cd7")
Atenção: ObjectId é um objeto e não uma
string
Como trabalhar esse ID numa URL? Ex.:
www.site.com.br/conteudo.php?id=51b278e1fc431ab4f748
4cd7
ou (via mod_rewrite)
Uso do $ nos operadores
$c->find(array('dist' => array('$lt' => 40)));
$c->find(array("dist" => array("$lt" => 40)));
✓
✗
Para mudar esse comportamento, edite a seguinte cláusula no ph
mongo.cmd = ":"
$c->find(array("dist" => array(":lt" => 40)));
Segurança: SQL Injection
• SQL
– todas as operações (select, delete, drop
etc) são passadas ao banco de dados como
string, através do método query
– SQL aceita múltiplos comandos na mesma
requisição, delimitados por ponto-e-vírgula
• mongoDB
– cada operação tem um método distinto
• Cenário:
– http://url/script.php?usuario=ari
$c->find(array("usr" => $_GET['usuario']));
• Ataque:
– http://url/script.php?usuario[$ne]=ninja
– PHP converte automaticamente essa string em array:
$c->find(array("usr" => array('$ne'=>'ninja')));
• Resultado: busca todos os usuário exceto o
ninja (decorrente do operador $ne – not equal)
• Contra-medida
– faça casting para string através de serialize,
http_build_query, implode etc.
Request Injection
Persistência de Objeto
<?php
$conexao= new MongoClient();
$db = $conexao->agencia;
$passeio = new stdClass();
$passeio->nome = 'Tour Nova Petropolis';
$passeio->valor = 140;
$colecao = $db->passeios;
$colecao->insert($passeio);
$conexao = null;
?>
Não salva atributos private e
protected
class Imoveis{
public $nome;
public $endereco;
private $reservado;
public function __construct($n, $e){
$this->nome = $n;
$this->endereco = $e;
$this->reservado = true;
}
}
$imoveis[] = new Imoveis("Cabana", "Estrada carazal");
$imoveis[] = new Imoveis("Apto", "Condomínio vale");
$colecao->insert($imoveis);
Fatal error: Uncaught exception 'MongoException' with message
'zero-length keys are not allowed, did you use $ with double quotes?' …
class Clientes{
public $nome;
public $trocas;
public function __construct($n, array $trocas){
$this->nome = $n;
$this->trocas = $trocas;
}
}
class Imoveis{
public $nome;
public $endereco;
public $reservado;
public function __construct($n, $e){
$this->nome = $n;
$this->endereco = $e;
$this->reservado = true;
}
}
class Trocas{
public $dia;
public $imovel;
public function __construct(DateTime $d, Imoveis $i){
$this->dia = $d;
$this->imovel = $i;
}
}
$imovel1 = new Imoveis("Cabana Carazal", "Estrada carazal, 3744");
$trocas[] = new Trocas(new DateTime, $imovel1);
$imovel2 = new Imoveis("Apto Vale do Bosque", "Condomínio vale");
$trocas[] = new Trocas(new DateTime, $imovel2);
$cliente = new Clientes("Ana Zago", $trocas);
$colecao->insert($cliente);
Paginação
$elementos = $c->find()->limit(2);
$elementos = $c->find()->skip(3);
//1 é ascendente e -1 descendente
$elementos = $c->find()->sort(array("nome" => 1));
$elementos = $c->find()->sort(array("cidade" => -1));
//Operações pré e pós consulta
$elementos = $c->find();
$elementos->sort(array("cidade" => -1, "nome" => 1));
Paginação: encadeando
$e = $c->find()->limit(2)->skip(1)->sort(array('nome'=>-1));
foreach($e as $item){
print_r($item);
}
Teorema de Brewer
• Em 2000 Eric Brewer definiu a equação
CAP
• Só pode escolher DUAS (das três
disponíveis)
Fonte: http://dbpedias.com/wiki/NoSQL:Consistency_Models_in_Non-Relational_Databases
• Consistência: clientes
enxergam os dados de
forma idêntica
• Disponibilidade: toda
operação tem uma resposta
• Partição: sistema continua
operante mesmo
enfrentado particionamento
mongoDB é fully consistent
• Realiza operações atômicas no documento
• Por natureza, dados são agrupados em um
único documento
• No entanto é suficiente e atende aos
requisitos ACID (Atomicidade, Consistência,
Isolamento e Durabilidade)
• Base relacional requer transações (para
garantir ACID) pois representa os dados em
diferentes tabelas
Fire and forget it
ACID x BASE
• Inserção assíncrona – comportamento
padrão:
$colecao->insert($clientes);
–Não bloqueia o script enquanto a instrução
não tenha sido efetivada
–Melhora a performance da aplicação (não
a do banco)
• Inserção síncrona (modelo tradicional):
$colecao->insert($clientes,
array('safe'=>true));
Update
• Dois formas:
– Substituição (de tudo)
– Modificação (somente daquilo que se
deseja)
Update in place
$colecao->update(
array( '_id' => new MongoId('4fb69113550a6bdd02000000') ),
array( '$set' => array( 'UF' => 'Pernambuco', 'CEP' => '50710-090'))
);
$colecao->update(
array( '_id' => new MongoId('4fb69113550a6bdd02000000') ),
array( array( 'UF' => 'Pernambuco' , 'CEP' => '50710-090'))
);
Sobrescreve TODO o
documento
Operador $set muda
ou adiciona elementos
Diferente de (string)” 4fb69113550a6bdd02000000”
✓
✗
• Operador $set é atômico e mais eficiente, portanto evite a
abordagem de manipular o array via PHP
• Primeiro parâmetro é o critério – nesse caso o ID do documento
update – adicionando campos
aninhados
$colecao->update(
array( '_id' => new MongoId('4fb69113550a6bdd02000000') ),
array( '$set' => array( 'proximo' =>
array( 'Banco Itaú', 'Carrefour', 'PanVel', 'Marista')
)
)
);
Adicionando (append)
$colecao->update(
array( '_id' => new MongoId('4fb69113550a6bdd02000000') ),
array( '$push'=> array( 'proximo' => 'Academia de ginastica'))
);
Método save
• save é um wrapper para os métodos
insert e update
• Se passar um objeto _id ele edita o
registro através do update
• Caso não passe, ele insere como um
novo documento através do método
insert
save (agindo como update)
$anuncio = array(
'nome' => 'MacBook',
'modelo' => 'Pro',
'tela' => '13"',
'tela_tipo' => 'retina',
'memoria' => '8Gb',
'HD' => '128Gb SSD',
'assessorios' => array('Fonte MagSafe original')
);
$colecao->save($anuncio); //Cria e gera _id 54526904b7f83ac71d0041a7
$anuncio = array(
'_id' => new MongoId('54526904b7f83ac71d0041a7'),
'nome' => 'MacBook',
'modelo' => 'Pro',
'tela' => '13"',
'tela_tipo' => 'retina',
'CPU' => "2.5 GHz Intel Core i5",
'memoria' => '8Gb',
'HD' => '500Gb Sata',
'specs' => array('bateria 8h', 'iSigh', 'thunderbolt'),
'assessorios' => array('Fonte MagSafe original')
);
$colecao->save($anuncio); //Sobrescreve
Excluíndo
$colecao->remove(array
('_id' => new MongoId('545280bab7f83ac71d0041a9')
));
$passeios->remove(array("nome" => "Uva e Vinho"),
array("justOne" => true));
http://php.net/manual/pt_BR/mongocollection.remove.php
Trabalhando com arrays: $in,
$nin e $all
$cursor = $colecao->find(
array('assessorios' =>
array('$in' =>
array('caixa original')
)
)
);
foreach($cursor as $doc){
print_r($doc);
}
ATENÇÃO: excluíndo sem critério
$colecao->remove();
$colecao->drop();
Índices
$criterio = array('num' => array('$gt' => 50000, '$lt' =>
500002));
print_r($c->find($criterio)->explain());
Índices: adicionando
$c->ensureindex(array('num' => 1));
Operadores de comparação
Operador Significado
$gt Greater than (maior que)
$gte Greater than equal (maior igual)
$in In (existe em)
$lt Less then (menor que)
$lte Less then equal (menor igual)
$ne Not equal (diferente)
$nin Not in (não existe em)
db.passeios.find({distancia: {$gte:100}})
Operadores de avaliação:
Expressões Regulares
$like = array('nome' => array(
'$regex' => new MongoRegex("/ari/i")));
$cursor = $colecao->find($like);
foreach($cursor as $item){
print_r($item);
}
Flag Significado
i case insensitive
m multiline
x can contain comments
l locale
s dotall, "." matches everything, including newlines
u match unicode
Projeção
Especifica quais campos serão retornados. Sintaxe:
find({critério},{projeção})
$projecao = array( "_id" => false,
"nome" => true,
"passeio" => true);
$like = array('nome'=>
array('$regex' => new MongoRegex("/ari/i")));
$cursor = $colecao->find($like, $projecao);
foreach($cursor as $item){
print_r($item);
}
ALERTA: (Projeção)
$proj = array( "_id" => false,
"nome" => true,
"passeio" => true,
"rg" => false,
"datahora" => false);
Fatal error: Uncaught exception
'MongoCursorException' with message
'servidor:27017: Can't canonicalize
query: BadValue Projection cannot have a
mix of inclusion and exclusion.'…
O único campo que permite omitir é o _id
✗
MongoDB Shell Enhancements
https://github.com/TylerBrock/mongo-hacker
• Console "anabolizada"
• Ordena documentos por
padrão
• Faz Highlight e
identações
• Funções e comandos
adicionais
• Modo verboso, mais
informativo
Novidades da release 3
https://www.mongodb.com/mongodb-3.0
• Nova arquitetura de armazenamento:
WiredTiger http://www.wiredtiger.com
• Compressão transparente nativa com
ganhos de até 80% de espaço em disco
• Melhorias no journaling e concorrência
na arquitetura original (MMAPv1).
Aumento de performance entre 7-10x
• Ops Manager* reduz em 95% o custo de
operação
• Permite mais de 50 membros de replica
set espalhados pelo mundo
Tenho como hospedar?
1
2
3
PaaS para MongoDB
Provisionamento, escalabilidade,
monitoramento, backup/restauração,
segurança, upgrades e suporte:
• https://mms.mongodb.com
• https://www.compose.io
• http://mongodirector.com
• https://mongolab.com
Ferramentas de administração
http://docs.mongodb.org/ecosystem/tools/administration-
interfaces/
• Fang of Mongo
https://github.com/Fiedzia/Fang-
of-Mongo
• Umongo
http://edgytech.com/umongo/
• MongoHub
http://mongohub.todayclose.com/
• RockMongo
• Genghis
• Mongobird
• RoboMongo
• MongoVUE
http://www.mongovue.com
• Opricot
https://github.com/argon/Opricot-
MongoConsole
• MongoVision
https://code.google.com/p/mong
o-vision/
mongoOWL
http://mongoowl.citsoft.ne
t
Vasta bibliografia…
Programa de certificação
• C100DBA
MongoDB Certified DBA Associate Exam
• C100DEV
MongoDB Certified Developer Associate
Exam
• 90 minutos de duração
Referências
• http://nosql-database.org/
• http://www.php.net/manual/en/mongo.tutor
ial.php
• https://mongolab.com
• Learning MongoDB – Tuts+
http://code.tutsplus.com/courses/learning-
mongodb
• Curso da Infinite Skills com Doug Bierer
http://www.infiniteskills.com/training/learnin
g-mongodb.html
E-mail:
arijunior@gmail.com
Twitter: @stopassola
Skype: stopassola
LinkedIn:
http://pt.linkedin.com/in/stopassola
Facebook:
http://www.facebook.com/arijunior
Sites:
http://www.perito.inf.br
http://www.certificamp.com
http://www.rumoacertificacaophp.com
Contatos
proud sponsor

Weitere ähnliche Inhalte

Was ist angesagt?

Nodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis terNodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis terEmerson Macedo
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rustBruno Rocha
 
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPPHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPiMasters
 
Integrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONIntegrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONMario Guedes
 
Introdução ao NodeJS
Introdução ao NodeJSIntrodução ao NodeJS
Introdução ao NodeJSGiovanni Bassi
 
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...iMasters
 
PHP e AJAX: do Request ao Framework
PHP e AJAX: do Request ao FrameworkPHP e AJAX: do Request ao Framework
PHP e AJAX: do Request ao FrameworkRafael Dohms
 
PHPSP TestFest 2009
PHPSP TestFest 2009PHPSP TestFest 2009
PHPSP TestFest 2009Rafael Dohms
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteMichael Cardoso
 
Conhecendo o Zend Framework
Conhecendo o Zend FrameworkConhecendo o Zend Framework
Conhecendo o Zend FrameworkJaime Neto
 
Abstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineAbstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineOtávio Calaça Xavier
 
NoSQL com Zend Framework 2
NoSQL com Zend Framework 2NoSQL com Zend Framework 2
NoSQL com Zend Framework 2Flávio Lisboa
 
Big data da teoria à prática
Big data  da teoria à práticaBig data  da teoria à prática
Big data da teoria à práticaMario Guedes
 
Introdução à Node.js + MongoDB
Introdução à Node.js + MongoDBIntrodução à Node.js + MongoDB
Introdução à Node.js + MongoDBLuiz Duarte
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com AjaxAdler Medrado
 
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...Rafael Jaques
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Emerson Macedo
 

Was ist angesagt? (20)

Nodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis terNodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis ter
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Como fazer boas libs
Como fazer boas libs Como fazer boas libs
Como fazer boas libs
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rust
 
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPPHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
 
Integrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONIntegrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSON
 
Introdução ao NodeJS
Introdução ao NodeJSIntrodução ao NodeJS
Introdução ao NodeJS
 
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
 
Boas práticas de API Design
Boas práticas de API DesignBoas práticas de API Design
Boas práticas de API Design
 
PHP e AJAX: do Request ao Framework
PHP e AJAX: do Request ao FrameworkPHP e AJAX: do Request ao Framework
PHP e AJAX: do Request ao Framework
 
PHPSP TestFest 2009
PHPSP TestFest 2009PHPSP TestFest 2009
PHPSP TestFest 2009
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil Competente
 
Conhecendo o Zend Framework
Conhecendo o Zend FrameworkConhecendo o Zend Framework
Conhecendo o Zend Framework
 
Abstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineAbstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP Doctrine
 
NoSQL com Zend Framework 2
NoSQL com Zend Framework 2NoSQL com Zend Framework 2
NoSQL com Zend Framework 2
 
Big data da teoria à prática
Big data  da teoria à práticaBig data  da teoria à prática
Big data da teoria à prática
 
Introdução à Node.js + MongoDB
Introdução à Node.js + MongoDBIntrodução à Node.js + MongoDB
Introdução à Node.js + MongoDB
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com Ajax
 
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
 

Ähnlich wie Introdução ao MongoDB: conceitos básicos e modelagem de dados

Desenvolvimento Mobile com Ruby
Desenvolvimento Mobile com RubyDesenvolvimento Mobile com Ruby
Desenvolvimento Mobile com RubyRodrigo Martins
 
Mongo DB
Mongo DBMongo DB
Mongo DBdist_bp
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Christiano Anderson
 
MongoDB - Apresentação
MongoDB - ApresentaçãoMongoDB - Apresentação
MongoDB - ApresentaçãoTerra / Neo
 
Desenvolvimento web com CodeIgniter
Desenvolvimento web com CodeIgniterDesenvolvimento web com CodeIgniter
Desenvolvimento web com CodeIgniterPedro Junior
 
Arquitetando Soluções de Dados com PostgreSQL
Arquitetando Soluções de Dados com PostgreSQLArquitetando Soluções de Dados com PostgreSQL
Arquitetando Soluções de Dados com PostgreSQLRaul Oliveira
 
Desenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDBDesenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDBiMasters
 
MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014Christiano Anderson
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSMatheus Donizete
 
MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014Christiano Anderson
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdoJorge Luís Gregório
 
Precisamos falar sobre MERN stack
Precisamos falar sobre MERN stackPrecisamos falar sobre MERN stack
Precisamos falar sobre MERN stackSidney Roberto
 
Redu walled garden
Redu walled gardenRedu walled garden
Redu walled gardenGuilherme
 

Ähnlich wie Introdução ao MongoDB: conceitos básicos e modelagem de dados (20)

Desenvolvimento Mobile com Ruby
Desenvolvimento Mobile com RubyDesenvolvimento Mobile com Ruby
Desenvolvimento Mobile com Ruby
 
Mongo DB
Mongo DBMongo DB
Mongo DB
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7
 
Node.js: serious business
Node.js: serious businessNode.js: serious business
Node.js: serious business
 
MongoDB - Apresentação
MongoDB - ApresentaçãoMongoDB - Apresentação
MongoDB - Apresentação
 
PHPMongoDB
PHPMongoDBPHPMongoDB
PHPMongoDB
 
Desenvolvimento web com CodeIgniter
Desenvolvimento web com CodeIgniterDesenvolvimento web com CodeIgniter
Desenvolvimento web com CodeIgniter
 
Arquitetando Soluções de Dados com PostgreSQL
Arquitetando Soluções de Dados com PostgreSQLArquitetando Soluções de Dados com PostgreSQL
Arquitetando Soluções de Dados com PostgreSQL
 
Mongo db slides
Mongo db slidesMongo db slides
Mongo db slides
 
MongoDB na Campus Party
MongoDB na Campus PartyMongoDB na Campus Party
MongoDB na Campus Party
 
Python e MongoDB - Ensol
Python e MongoDB - EnsolPython e MongoDB - Ensol
Python e MongoDB - Ensol
 
Desenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDBDesenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDB
 
MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JS
 
Workshop MongoDB
Workshop MongoDBWorkshop MongoDB
Workshop MongoDB
 
MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
 
Precisamos falar sobre MERN stack
Precisamos falar sobre MERN stackPrecisamos falar sobre MERN stack
Precisamos falar sobre MERN stack
 
Redu walled garden
Redu walled gardenRedu walled garden
Redu walled garden
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 

Mehr von Ari Stopassola Junior

Mehr von Ari Stopassola Junior (9)

Doctrine for dummies
Doctrine for dummiesDoctrine for dummies
Doctrine for dummies
 
PHP Community Spirit
PHP Community SpiritPHP Community Spirit
PHP Community Spirit
 
DevOps: desenvolvedores e sysadmins cooperando na prática
DevOps: desenvolvedores e sysadmins cooperando na práticaDevOps: desenvolvedores e sysadmins cooperando na prática
DevOps: desenvolvedores e sysadmins cooperando na prática
 
Rumo à Certificação PHP
Rumo à Certificação PHPRumo à Certificação PHP
Rumo à Certificação PHP
 
Ti na Stopassola Advocacia
Ti na Stopassola AdvocaciaTi na Stopassola Advocacia
Ti na Stopassola Advocacia
 
Workshop Magento
Workshop MagentoWorkshop Magento
Workshop Magento
 
Typo3 - instalação e template
Typo3 - instalação e templateTypo3 - instalação e template
Typo3 - instalação e template
 
Missao Portugal
Missao PortugalMissao Portugal
Missao Portugal
 
Treinamento PHP: Strings & Patterns
Treinamento PHP: Strings & PatternsTreinamento PHP: Strings & Patterns
Treinamento PHP: Strings & Patterns
 

Introdução ao MongoDB: conceitos básicos e modelagem de dados

  • 2. Bacharel em Informática com ênfase em Análise de Sistemas pela Unisinos, cursou mestrado em Engenharia Informática e de Computadores pelo Instituto Superior Técnico da Universidade Técnica de Lisboa (Portugal), perito judicial ad hoc especializado em TI (mantenedor do site PERITO.inf.br), Zend Certified Engineer (PHP 5.3) e Zend Certified PHP Engineer (PHP 5.5) #ZEND004019, Certified ScrumMaster pela Scrum Alliance #203613, Microsoft Certified Professional (MCP), idealizador do projeto Certificamp, consultor web e PHP evangelist. Ari Stopassola Junior
  • 3. Roadmap • conceito de bases de dados NoSQL • cases • comparações com o modelo relacional • expressões SQL x MongoDB (orientado à documentos) • instalação • recursos do MongoDB • operações via console • modelagem: embedded, manual e DBRef • driver PHP • anatomia do código PHP • CRUD (Create, Read, Update and Delete) • ObjectId • operadores • segurança • persistência de objetos • tratamento arrays (documentos aninhados) • índices (performance) • projeção • hospedagem (PaaS) • novidades da versão 3 • ferramentas de administração • programa de certificação
  • 4.
  • 5. NoSQL • Not Only SQL (poderia ser NOSQL) • Movimento de bancos de dados não relacionais • Também chamados: Modelo Relacional Não Normalizado (MRNN) • Seria mais apropriado dizer então “No relational” pois alguns SGBDs possuem interface SQL, embora sejam categorizados como NoSQL. Ex.: OrientDB
  • 6. Taxonomia das bases NoSQL • Documento (XML ou JSON) – RavenDB, CouchDB, MongoDB • Orientado a Objetos – Db4o • Chave/Valor (Key/Value) – Redis, SimpleDB, Hbase, MemcacheDB, Riak, Berkeley DB • Tabular (inspirado no BigTable do Google) – Cassandra (Apache), Hypertable, Hbase • Orientado a colunas (relacionais com características NoSQL) – Vertica, MonetDB, LucidDB, Infobright • Grafos (Graph) – Neo4j, OrientDB, Titan, DEX, InfiniteGraph, InfoGrid, HyperGraphDB • Outros – Chordless, Mnesia Fonte: http://pt.wikipedia.org/wiki/NoSQL
  • 7. Quem usa NoSQL? • eBay (pioneiro) • New York Times • Foursquare • Electronic Arts • GitHub • SAP • Disney • Twitter “Fifteen months ago, It took two weeks to perform ALTER TABLE on the statuses [tweets] table.” (setembro/2010) Fonte: http://www.mongodb.org/about/production-deployments/
  • 8. • Responsável por 438 casamentos ao dia nos EUA • Algoritmo “Compatibility Matching System” reduz significativamente o número de separações • +51 milhões de usuários • Processa 1 bilhão de combinações de casais • Sob RDBMS demorava 2 semanas processando Fonte: http://www.mongodb.com/press/mongodb-powers-critical-eharmony-compatibility-application-processing-1-billion-matches-dail-0 http://www.mongodb.com/presentations/big-dating-eharmony
  • 9. Base orientada a documentos Fonte: livro “MongoDB and PHP” de Steve Francia publicado pela O’Reilly
  • 10. Por quê? • Sistemas Orientados à Objetos requer ORM (Object-Relational Mapping) • Normalização precisa de JOINs • Complexidade dos relacionamentos • Problemas ao escalar: vertical versus horizontal
  • 13. Diagrama ER do catálogo de produtos do Magento
  • 16. AMP
  • 17. MongoDB http://www.mongodb.org • Nome vem da expressão huMONGOus que significa “extremamente enorme” • Banco de dados open source: https://github.com/mongodb/ • Criado pela 10gen em C++, orientado a documentos (formato JSON/BSON) • Escalável • Schemaless (não há colunas ou tipos de dados) JavaScript Object Notation
  • 18.
  • 19.
  • 20. Expressões SQL em MongoDB SQL MongoDB Database Database Table Collection Index Index Row Document Column Field Joining Embedding & linking Partition Shard Fonte: “Reference Cards for MongoDB”
  • 21. Hierarquia • Bancos de dados armazenam coleções • Coleções possuem documentos • No contexto PHP, documentos são arrays multidimensionais • Do ponto de vista do MongoDB, são estruturas em JSON: Imagem extraída de: http://habrahabr.ru/post/156633
  • 23. Instalação manual: OSX e Linux 1) Baixe o binário do MongoDB em http://www.mongodb.org/downloads Descompacte o arquivo mongodb-osx-x86_64-2.x.x.tgz 2) Renomeie o diretório (resultado da descompactação) para um nome mais apropriada. Ex.: mongodb 3) Abra o terminal e adicione ao final do arquivo /etc/paths o caminho: sudo vim /etc/paths Adicione a linha (de acordo com o diretório onde o MongoDB se encontra). Ex.: /Users/ari/mongodb/bin echo "export PATH=$PATH:/Users/ari/mongodb/bin" > ~/.bash_profile 4) Crie diretórios para armazenar as bases. O binário disponibilizado pela 10gen prevê que a base ficará na raiz do sistema operacional: sudo mkdir -p /data/db/ sudo chown `id -u` /data/db 5) Inicie o serviço (deamon): ./mongod & 6) Abra a console do MongoDB e realize um teste: mongo > db.passeios.save( { a : 1 } ) > db.passeios.find() sudo ./mongod & (dependendo das permissões de usuário) Método alternativo ao passo 3
  • 24. Instalação: Windows • Download (certifique-se da arquitetura: 32 ou 64bit) • Descomprimir no C:mongodb-win32-i386-2.x.x • Renomear a pasta para C:mongodb • Abra o terminal como usuário Administrador • Crie o diretório c:datadb cd .... md data md datadb • Execute o deamon do MongoDB: c:mongodbbinmongod.exe • Em outra console execute o client: c:mongodbbinmongo.exe Fonte: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/
  • 25. Driver para PHP https://github.com/mongodb/mongo-php-driver • Mantido por Derick Rethans (autor do xDebug e vários outros projetos significativos): http://derickrethans.nl • http://docs.mongodb.org/ecosystem/drivers/p hp/ Foto: http://steve.maraspin.net/photo/gallery/conferences/2012-phpday-verona-italy/
  • 26. Instalação do driver PHP para mongoDB http://pecl.php.net/package/mongo # sudo pecl install mongo Adicione a linha extension=mongo.so no php.ini http://soupforthegirlysoul.blogspot.com.br/2012/03/sunday-smiles-optimism-opportunists-and.html
  • 27. Habilite a extensão PHP no ZendServer CE
  • 28. Verifique se o módulo foi habilitado: phpinfo()
  • 29. Documentação antiga • A partir da versão 1.3.0 do driver, Derick Rethans mudou o nome da classe de Mongo para MongoClient • Mais detalhes no post institulado “Mongo is dead, long live MongoClient”:http://derickrethans.nl/mong oclient.html
  • 30. phpMoAdmin 1. Acesse: http://www.phpmoadmin.com/ 2. Faça o download do phpmoadmin.zip, descomprima e copie o script moadmin.php para a raiz do Apache – coloque uma autenticação (caso deseje)
  • 31. Anatomia do código PHP <?php $conexao = new MongoClient(); $db = $conexao->nomebase; $clientes = array( 'nome' => "Ari Stopassola Junior", 'endereco'=> "Estrada do Carazal, 3744", 'cidade' => "Gramado" ); $colecao = $db->clientes; $colecao->insert($clientes); $elementos = $colecao->find( array('cidade' => 'Gramado')); foreach ($elementos as $obj) { echo $obj['endereco']."<br>"; } ?>
  • 32. Conexão //Conecta em localhost:27017 $conexao = new MongoClient(); //Conecta no host remoto na porta default $conexao = new MongoClient("200.248.240.62"); //Host remoto na porta especificada $conexao = new MongoClient("exemplo.com:65432"); $conexao = new MongoClient("localhost:27017", array("username" => "root", "password" => "senha"));
  • 33. Conexão (mais elegante) try { $conexao = new MongoClient(); } catch (MongoConnectionException $e){ die($e->getMessage()); }
  • 34. Base de dados $db = $conexao->nomebase; //Formato alternativo $db = $conexao->selectDB('nomebase'); ATENÇÃO: se a base não existir, ela será criada, portanto certifique-se bem do nome da base.
  • 35. Coleção //Faz referência a coleção $colecao = $db->clientes; //Formato direto, partindo da conexão $colecao = $conexao->nomebase->clientes; //Formato alternativo $colecao = $db->selectCollection('clientes');
  • 36. Inserção Documento == Array PHP $clientes = array( 'nome' => "Ari Stopassola Junior", 'endereco'=> "Estrada do Carazal, 3744", 'cidade' => "Gramado", 'UF' => "Rio Grande do Sul", 'CEP' => "95670-000" ); $colecao->insert($clientes);
  • 37. Inserção: documento dentro de documento$passeio = array( "nome" => "Raízes Coloniais", "valor" => 90, "opcionais” => array("almoco" => true, "transfer" => true), "observacoes" => "Senhor obeso, portanto reserve dois assentos", "data" => new MongoDate() ); db.passeios.insert({ "nome": "Itaimbezinho", "valor": 120, "opcionais": [ { "almoco": false, "transfer": true, "observacoes": "Vai a família toda" } ], "observacoes": "já foi pago", "data": new Date() }) Sob o ponto de vista relacional, não seria possível inserir um array no campo “opcionais”. Seria necessário uma nova tabela (provavelmente até uma terceira tabela, dependendo do nível de normalização) para que isso fosse viável – sendo imprescindível o uso de JOINS
  • 38.
  • 40. What’s happening?! • Não criamos a base de dados • Não utilizamos cláusulas SQL como : CREATE TABLE, auto_increment, PRIMARY KEY, INDEX etc • Não utilizamos ALTER TABLE para adicionar novos campos • Não foi necessário aplicar JOINS entre entidades • Nada de PDO, ORM ou bibliotecas externas
  • 42. • Quando a entidade tornar-se muito grande, pode-se quebrá-la em mais coleções • Mantém o ObjectID como referência • Esse link deve ser criado manualmente Relação "UM para UM" (abordagem manual)
  • 43. Relação "UM para UM" manual (definição de classes)<?php class Servico{ public $_id; public $nome; public $datahora; public function __construct($i, $n, DateTime $d){ $this->_id = $i; $this->nome = $n; $this->datahora = $d; } } class NotaFiscal{ public $servico_id; const emitente = "Empresa Ltda"; public $danfe; public $valor; public function __construct($s_id, $d, $v){ $this->servico_id= $s_id; $this->danfe = $d; $this->valor = $v; } }
  • 44. Faço o encadeamento manualmente $conexao = new MongoClient(); //Conecta no mongoDB $db = $conexao->turismo; //Escolhe a base de dados $servicos = $db->servicos; //Escolhe a coleção $notasfiscais = $db->notasfiscais; //Escolhe a coleção //Gero um ObjectID, para que eu possa fazer o encadeamento depois $serv[] = new Servico(new MongoID(), "Tour Uva e Vinho", new DateTime); $serv[] = new Servico(new MongoID(), "Itaimbezinho", new DateTime); $servicos->batchInsert($serv); //O ObjectID será criado implicitamente $nf[] = new NotaFiscal($serv[0]->_id->__toString(), "12.34", 89); $nf[] = new NotaFiscal($serv[1]->_id->__toString(), "56.78", 152.50); $notasfiscais->batchInsert($nf); //Localiza um servico $servico = $servicos->findOne(array('nome' => 'Itaimbezinho')); $notafiscal = $notasfiscais->findOne(array('servico_id' => $servico['_id']- >__toString()));
  • 45. DBRefs: Data Base References • Convenção para representar um documento de outra coleção • Forma mais elegante de relacionar coleções • A abordagem manual funciona bem com dois ou três documentos vinculados. Caso necessite associar múltiplas coleções, considere usar DBRef • Alerta: nem toda linguagem suporta esse recurso (PHP possui!)
  • 46. <?php class EmpresaParceira{ public $_id; public $nome; public $endereco; public function __construct($i, $n, $e){ $this->_id = $i; $this->nome = $n; $this->endereco = $e; } } class Colaborador{ public $nome; public $empresa; public function __construct($n, $e){ $this->nome = $n; $this->empresa = $e; } } Relação "UM para UM" em DBRef Definição de classes
  • 47. Referenciando //Gero um ObjectID, para que eu possa referenciar depois $empr[] = new EmpresaParceira(new MongoID(), "AEREA", "Dom Pedro II, 90"); $empr[] = new EmpresaParceira(new MongoID(), "VillaBella", "Av. VillaBella"); $empresas->batchInsert($empr); //Exemplo via console (JavaScript) //var id = new ObjectId('548b3f4bb7f83aa35a0041a8'); //id do VillaBella //db.colaboradores.insert({nome: 'Diego Rossi', empresa: {'$ref':'empresas', '$id':id, '$db':'turismo'}}); //O ObjectID será criado implicitamente $colab[]= new Colaborador("Cleyton Arghiropol", MongoDBRef::create("empresas", $empr[0]->_id, "turismo")); $colab[]= new Colaborador("Paloma Santiago", MongoDBRef::create("empresas", $empr[1]->_id, "turismo")); $colaboradores->batchInsert($colab); $colaborador = $colaboradores->findOne(array('nome' => 'Paloma Santiago')); print_r($colaborador); $ref (Coleção) $id (ObjectID) $db (Banco de dados opcional)
  • 48. Consultando: método getDBRef //Localiza um colaborador e obtém a empresa parceira, através de DBRef $colaborador = $colaboradores->findOne(array('nome' => 'Paloma Santiago')); $empresa = $colaboradores->getDBRef($colaborador['empresa']);
  • 49. batchInsert $anuncios[] = array( 'nome' => 'iPod', 'modelo' => 'Touch', 'capacidade' => '16Gb', ); $anuncios[] = array( 'nome' => 'Airport Express', 'specs' => array('AirPlay', 'dual band') ); $anuncios[] = array( 'nome' => 'iBook', 'modelo' => 'Clamshell', 'CPU' => 'G3 366 Mhz', 'specs' => array('Airport', 'fonte YoYo') ); $colecao->batchInsert($anuncios);
  • 50. Consulta //Busca TODOS $elementos = $colecao->find(); foreach ($elementos as $objeto) { echo $objeto['endereco']."n"; } //Filtra por alguma característica $elementos = $colecao->find(array('cidade'=>'Gramado'));
  • 51. find versus findone findone retorna um objeto do tipo MongoId print_r($resultado); find retorna um objeto do tipo MongoCursor foreach($resultado as $item) { print_r($item); } http://php.net/manual/pt_BR/class.mongoid.php http://php.net/manual/pt_BR/class.mongocursor.php requer iteração
  • 52. ObjectId (equivalente a PK) • Cada documento (registro) recebe um código único e imutável, chamado ObjectId • Esse identificador baseia-se no momento em que a inserção foi realizada, em conjunto com o nome do host, concatenado ao PID (process ID) do servidor e um número aleatório > db.passeios.find()[0] > db.passeios.find()[0]._id > db.passeios.find()[0]._id.getTimestamp() ISODate("2013-06-07T20:07:26Z")
  • 53. ObjectID $id = new MongoId('54526904b7f83ac71d0041a7'); $resultado = $colecao->findone(array('_id' => $id)); print_r($resultado); $id = '54526904b7f83ac71d0041a7'; $resultado = $colecao->findone(array('_id' => $id)); print_r($resultado); ✓ ✗
  • 54. Como referenciar um ObjectId > new ObjectId ObjectId("51b278e1fc431ab4f7484cd7") Atenção: ObjectId é um objeto e não uma string Como trabalhar esse ID numa URL? Ex.: www.site.com.br/conteudo.php?id=51b278e1fc431ab4f748 4cd7 ou (via mod_rewrite)
  • 55. Uso do $ nos operadores $c->find(array('dist' => array('$lt' => 40))); $c->find(array("dist" => array("$lt" => 40))); ✓ ✗ Para mudar esse comportamento, edite a seguinte cláusula no ph mongo.cmd = ":" $c->find(array("dist" => array(":lt" => 40)));
  • 56. Segurança: SQL Injection • SQL – todas as operações (select, delete, drop etc) são passadas ao banco de dados como string, através do método query – SQL aceita múltiplos comandos na mesma requisição, delimitados por ponto-e-vírgula • mongoDB – cada operação tem um método distinto
  • 57. • Cenário: – http://url/script.php?usuario=ari $c->find(array("usr" => $_GET['usuario'])); • Ataque: – http://url/script.php?usuario[$ne]=ninja – PHP converte automaticamente essa string em array: $c->find(array("usr" => array('$ne'=>'ninja'))); • Resultado: busca todos os usuário exceto o ninja (decorrente do operador $ne – not equal) • Contra-medida – faça casting para string através de serialize, http_build_query, implode etc. Request Injection
  • 58. Persistência de Objeto <?php $conexao= new MongoClient(); $db = $conexao->agencia; $passeio = new stdClass(); $passeio->nome = 'Tour Nova Petropolis'; $passeio->valor = 140; $colecao = $db->passeios; $colecao->insert($passeio); $conexao = null; ?>
  • 59. Não salva atributos private e protected class Imoveis{ public $nome; public $endereco; private $reservado; public function __construct($n, $e){ $this->nome = $n; $this->endereco = $e; $this->reservado = true; } } $imoveis[] = new Imoveis("Cabana", "Estrada carazal"); $imoveis[] = new Imoveis("Apto", "Condomínio vale"); $colecao->insert($imoveis); Fatal error: Uncaught exception 'MongoException' with message 'zero-length keys are not allowed, did you use $ with double quotes?' …
  • 60. class Clientes{ public $nome; public $trocas; public function __construct($n, array $trocas){ $this->nome = $n; $this->trocas = $trocas; } } class Imoveis{ public $nome; public $endereco; public $reservado; public function __construct($n, $e){ $this->nome = $n; $this->endereco = $e; $this->reservado = true; } } class Trocas{ public $dia; public $imovel; public function __construct(DateTime $d, Imoveis $i){ $this->dia = $d; $this->imovel = $i; } }
  • 61. $imovel1 = new Imoveis("Cabana Carazal", "Estrada carazal, 3744"); $trocas[] = new Trocas(new DateTime, $imovel1); $imovel2 = new Imoveis("Apto Vale do Bosque", "Condomínio vale"); $trocas[] = new Trocas(new DateTime, $imovel2); $cliente = new Clientes("Ana Zago", $trocas); $colecao->insert($cliente);
  • 62. Paginação $elementos = $c->find()->limit(2); $elementos = $c->find()->skip(3); //1 é ascendente e -1 descendente $elementos = $c->find()->sort(array("nome" => 1)); $elementos = $c->find()->sort(array("cidade" => -1)); //Operações pré e pós consulta $elementos = $c->find(); $elementos->sort(array("cidade" => -1, "nome" => 1));
  • 63. Paginação: encadeando $e = $c->find()->limit(2)->skip(1)->sort(array('nome'=>-1)); foreach($e as $item){ print_r($item); }
  • 64. Teorema de Brewer • Em 2000 Eric Brewer definiu a equação CAP • Só pode escolher DUAS (das três disponíveis) Fonte: http://dbpedias.com/wiki/NoSQL:Consistency_Models_in_Non-Relational_Databases • Consistência: clientes enxergam os dados de forma idêntica • Disponibilidade: toda operação tem uma resposta • Partição: sistema continua operante mesmo enfrentado particionamento
  • 65. mongoDB é fully consistent • Realiza operações atômicas no documento • Por natureza, dados são agrupados em um único documento • No entanto é suficiente e atende aos requisitos ACID (Atomicidade, Consistência, Isolamento e Durabilidade) • Base relacional requer transações (para garantir ACID) pois representa os dados em diferentes tabelas
  • 66. Fire and forget it ACID x BASE • Inserção assíncrona – comportamento padrão: $colecao->insert($clientes); –Não bloqueia o script enquanto a instrução não tenha sido efetivada –Melhora a performance da aplicação (não a do banco) • Inserção síncrona (modelo tradicional): $colecao->insert($clientes, array('safe'=>true));
  • 67. Update • Dois formas: – Substituição (de tudo) – Modificação (somente daquilo que se deseja)
  • 68. Update in place $colecao->update( array( '_id' => new MongoId('4fb69113550a6bdd02000000') ), array( '$set' => array( 'UF' => 'Pernambuco', 'CEP' => '50710-090')) ); $colecao->update( array( '_id' => new MongoId('4fb69113550a6bdd02000000') ), array( array( 'UF' => 'Pernambuco' , 'CEP' => '50710-090')) ); Sobrescreve TODO o documento Operador $set muda ou adiciona elementos Diferente de (string)” 4fb69113550a6bdd02000000” ✓ ✗ • Operador $set é atômico e mais eficiente, portanto evite a abordagem de manipular o array via PHP • Primeiro parâmetro é o critério – nesse caso o ID do documento
  • 69. update – adicionando campos aninhados $colecao->update( array( '_id' => new MongoId('4fb69113550a6bdd02000000') ), array( '$set' => array( 'proximo' => array( 'Banco Itaú', 'Carrefour', 'PanVel', 'Marista') ) ) );
  • 70. Adicionando (append) $colecao->update( array( '_id' => new MongoId('4fb69113550a6bdd02000000') ), array( '$push'=> array( 'proximo' => 'Academia de ginastica')) );
  • 71. Método save • save é um wrapper para os métodos insert e update • Se passar um objeto _id ele edita o registro através do update • Caso não passe, ele insere como um novo documento através do método insert
  • 72. save (agindo como update) $anuncio = array( 'nome' => 'MacBook', 'modelo' => 'Pro', 'tela' => '13"', 'tela_tipo' => 'retina', 'memoria' => '8Gb', 'HD' => '128Gb SSD', 'assessorios' => array('Fonte MagSafe original') ); $colecao->save($anuncio); //Cria e gera _id 54526904b7f83ac71d0041a7 $anuncio = array( '_id' => new MongoId('54526904b7f83ac71d0041a7'), 'nome' => 'MacBook', 'modelo' => 'Pro', 'tela' => '13"', 'tela_tipo' => 'retina', 'CPU' => "2.5 GHz Intel Core i5", 'memoria' => '8Gb', 'HD' => '500Gb Sata', 'specs' => array('bateria 8h', 'iSigh', 'thunderbolt'), 'assessorios' => array('Fonte MagSafe original') ); $colecao->save($anuncio); //Sobrescreve
  • 73. Excluíndo $colecao->remove(array ('_id' => new MongoId('545280bab7f83ac71d0041a9') )); $passeios->remove(array("nome" => "Uva e Vinho"), array("justOne" => true)); http://php.net/manual/pt_BR/mongocollection.remove.php
  • 74. Trabalhando com arrays: $in, $nin e $all $cursor = $colecao->find( array('assessorios' => array('$in' => array('caixa original') ) ) ); foreach($cursor as $doc){ print_r($doc); }
  • 75. ATENÇÃO: excluíndo sem critério $colecao->remove(); $colecao->drop();
  • 76. Índices $criterio = array('num' => array('$gt' => 50000, '$lt' => 500002)); print_r($c->find($criterio)->explain());
  • 78. Operadores de comparação Operador Significado $gt Greater than (maior que) $gte Greater than equal (maior igual) $in In (existe em) $lt Less then (menor que) $lte Less then equal (menor igual) $ne Not equal (diferente) $nin Not in (não existe em) db.passeios.find({distancia: {$gte:100}})
  • 79. Operadores de avaliação: Expressões Regulares $like = array('nome' => array( '$regex' => new MongoRegex("/ari/i"))); $cursor = $colecao->find($like); foreach($cursor as $item){ print_r($item); } Flag Significado i case insensitive m multiline x can contain comments l locale s dotall, "." matches everything, including newlines u match unicode
  • 80. Projeção Especifica quais campos serão retornados. Sintaxe: find({critério},{projeção}) $projecao = array( "_id" => false, "nome" => true, "passeio" => true); $like = array('nome'=> array('$regex' => new MongoRegex("/ari/i"))); $cursor = $colecao->find($like, $projecao); foreach($cursor as $item){ print_r($item); }
  • 81. ALERTA: (Projeção) $proj = array( "_id" => false, "nome" => true, "passeio" => true, "rg" => false, "datahora" => false); Fatal error: Uncaught exception 'MongoCursorException' with message 'servidor:27017: Can't canonicalize query: BadValue Projection cannot have a mix of inclusion and exclusion.'… O único campo que permite omitir é o _id ✗
  • 82. MongoDB Shell Enhancements https://github.com/TylerBrock/mongo-hacker • Console "anabolizada" • Ordena documentos por padrão • Faz Highlight e identações • Funções e comandos adicionais • Modo verboso, mais informativo
  • 83. Novidades da release 3 https://www.mongodb.com/mongodb-3.0 • Nova arquitetura de armazenamento: WiredTiger http://www.wiredtiger.com • Compressão transparente nativa com ganhos de até 80% de espaço em disco • Melhorias no journaling e concorrência na arquitetura original (MMAPv1). Aumento de performance entre 7-10x • Ops Manager* reduz em 95% o custo de operação • Permite mais de 50 membros de replica set espalhados pelo mundo
  • 85. PaaS para MongoDB Provisionamento, escalabilidade, monitoramento, backup/restauração, segurança, upgrades e suporte: • https://mms.mongodb.com • https://www.compose.io • http://mongodirector.com • https://mongolab.com
  • 86. Ferramentas de administração http://docs.mongodb.org/ecosystem/tools/administration- interfaces/ • Fang of Mongo https://github.com/Fiedzia/Fang- of-Mongo • Umongo http://edgytech.com/umongo/ • MongoHub http://mongohub.todayclose.com/ • RockMongo • Genghis • Mongobird • RoboMongo • MongoVUE http://www.mongovue.com • Opricot https://github.com/argon/Opricot- MongoConsole • MongoVision https://code.google.com/p/mong o-vision/ mongoOWL http://mongoowl.citsoft.ne t
  • 88. Programa de certificação • C100DBA MongoDB Certified DBA Associate Exam • C100DEV MongoDB Certified Developer Associate Exam • 90 minutos de duração
  • 89. Referências • http://nosql-database.org/ • http://www.php.net/manual/en/mongo.tutor ial.php • https://mongolab.com • Learning MongoDB – Tuts+ http://code.tutsplus.com/courses/learning- mongodb • Curso da Infinite Skills com Doug Bierer http://www.infiniteskills.com/training/learnin g-mongodb.html

Hinweis der Redaktion

  1. From scratch
  2. De programador para programador
  3. O “No” dá um aspecto de negação
  4. Chave/Valos são considerados os mais rápidos e suportam mais carga de dados, pois trata-se de uma hash de chave que aponta para seu respectivo dado (que pode ser um objeto, string etc) Documentos são mais sofisticados, pois podem possuir subdocumentos - o “expoente” é o MongoDB. Riak está sendo usado em 25% das empresas que figuram no Fortune 50 – ele é baseado no Dynamo (Amazon). Neo4j consegue armazenar 32 bilhões de nós.
  5. No Brasil: CartolaFC, MTV Craiglist (classificados com bilhões de registros)
  6. ACID: executa tudo ou nada (rollback), não permite que a base fique em estado inconsistente, uma transação não inferfere na outra e persiste fisicamente. Integridade x tolerância Consistência x disponibilidade Estratégia
  7. Algoritmo “Compatibility Matching System” RDBMS é a sigla para Relational database management system”
  8. Terminologia: Tabela -> Collection; Rows -> Document; Query -> JSON; Partition -> Shard
  9. Object-Relational Mapping gera overhead, exceto um CRUD (que é rápido). Escalabilidade depende diretamente da camada de persistência. Normalização é o processo de organização dos dados com o objetivo de minimizar a redundância, dependência e inconsistência Normalização requer JOINS que, muitas vezes, são custosos (em termos de tempo de execução e recurso computacional) Relacionamentos tornam difícil a escalabilidade horizontal Em ambiente de cluster, transações em múltiplas tabelas tornam-se complexas Não precisa de migrations
  10. Escalabilidade vertical seria adicionar mais memória, expandir disco, substituir processador etc. As letra são os "Shard keys"
  11. resiliência, tolerância a falhas, failover
  12. http://www.magento-exchange.com/magento-database/magento-1-4-database-er-diagram-for-catalog-and-product-tables/#
  13. Embedded approach Permite até 16Mb por documento e aproximadamente 100 aninhamentos: http://docs.mongodb.org/manual/reference/limits/ Deve ser a primeira abordagem a ser considerada, também por ser mais performática.
  14. http://hadoop.apache.org/docs/r1.0.4/mapred_tutorial.html
  15. Apacha está sendo substituído pelo NGINX
  16. BSON: Binary-JSON - http://bsonspec.org MongoDB é fully consistent API simples
  17. https://whatsthebigdata.files.wordpress.com/2015/02/nosql-bar-joke.jpeg Você não precisa definir a estrutura apriori, lhe permitindo armazenar dados de acordo com a necessidade (coleções dinâminas não estruturadas) Mongoose é um framework ODM que propõe esquema nos dados do Mongo (embora as validações possam ser feitas na Model)
  18. Mantenedora
  19. JSON suporta: string, integer, double, Boolean, array, object, null
  20. O comando: id –u (terminal do MacOSX) mostra o ID do usuário logado. Talvez ele não encontre o executável, portanto execute ./mongod & Versões do MongoDB em 32-bit tem limite de dados em 2GB. A console do MongoDB é feita em JavaScript. Para alterar a localização do banco, crie o diretório “data/db”: mkdir -p /Users/AriStopassolaJunior/mongodb/data/db Baixe o monbodb.conf: https://github.com/mongodb/mongo/blob/master/rpm/mongod.conf Altere as diretrizes dbpath, logpath e logappend (as três principais) Para testar se há outra instância do MongoDB rodando basta executar mongod –f /diretorio/monbod.conf
  21. Possui drivers para 12 linguagens diferentes.
  22. Lembre-se de reiniciar o servidor.
  23. Ver “drivers” do MongoDB para diversas linguagens.
  24. Análogo ao phpMyAdmin e phpPgAdmin
  25. Ao acionar o client do MongoDB ele conecta-se automaticamente na base: test Outra forma de visualização (idêntica ao pretty) seria: db.passeios.find().forEach(printjson)
  26. ObjectId é obrigatório e sempre retorna. Exit sai do terminal 1 é ASC (ascendente) -1 é DESC (descendente)
  27. $conexao->listDBs(); //Lista todas as bases
  28. Com senha
  29. Se houver algum erro de conexão ou execução da uma query, será lançado um objeto MongoConnectionException (derivado da classe Exception, nativa do PHP), portanto se consegue manipular o erro utilizando um bloco try/catch. Para derrubar o banco, execute: use admin db.shutdownServer()
  30. análoga a tabela em RDBMS
  31. Documento dentro de documento. No PHP usa-se instancia-se a classe MongoDate, enquanto que na console usa-se apenas Date()
  32. Não basta apontar para a coleção (caso ainda não exista). É preciso adicionar algum item para que ela seja criada efetivamente: $colecao = $db->selectCollection('imoveis');
  33. Não suportado em C. C++ e Perl
  34. Não é uma chave estrangeira! Ou seja, não há integriade referencial. Nem mesmo a coleção na qual está se linkando precisa existir…
  35. Testei com insert e funciona igual.
  36. Portanto seria desnecessário guardar, num campo específico, a data de criação do registro – pois essa informação já consta no ObjectID PK é uma string ou integer
  37. Experimente fazer um left outer join num ORM, ou uma função de agregação como média. Alguns falharam ao executar transações, passando a responsabilidade para a aplicação. Não há necessidade de cache, pois o mongoDB já fica em memório – o quanto houver de RAM disponível. Usar monboDB simplifica o desenvolvimento da aplicação pois não requer tratar de atualizações de registros, cache expirado etc.
  38. É uma limitação do driver PHP para mongoDB
  39. Usr._id mostra o ObjectId do documento na collection
  40. Skip ele pula x elementos (semelhante ao OFFSET do SQL) Classe MongoCursor http://php.net/manual/pt_BR/class.mongocursor.php
  41. MongoDB é C e P
  42. ACID é pessimista, forçando a consistência. BASE é otimista. Ao inserir o PHP não bloquei a execução aguardando um retorno do banco. Se for síncrono, espera até o banco se manifestar. "Safe" não significa consistência. Operações ficam bufferizadas
  43. $unset remove um campo. Ex.: $artigos->update(array('_id' => MongoId('4dcd2abe5981')), array('$unset' => array('titulo' => True)));
  44. $set é chamado de operador “in place” Observe que $set NÃO é uma variável e sim um operador do MongoDB.
  45. Upsert: se o critério não for satisfeito, um novo documento é criado com o critério.
  46. Um append seria equivalente a um ALTER TABLE
  47. mongoDB usa BTree
  48. onde 1 ascendente e -1 descendente
  49. Semelhante ao LIKE do SQL
  50. Ou tudo true ou tudo false
  51. Lançado dia 3/fevereiro/2015
  52. Point-In-Time Recovery
  53. Mensagem: “umongo.app” está danificado e não pode ser aberto. Você deve movê-lo para o Lixo. Basta acessar: Preferências do Sistema -> Segurança e Privacidade -> aba Geral Onde diz “Permitir aplicativos transferidos de:” marcar a opção “Qualquer lugar”.
  54. Derrubando outro mito
  55. Usa o software Remote Proctor Now: testa câmera, microfone e não permite que haja dois monitores acoplados no mesmo computador.
  56. entregar adesivos!