TDC2013 SP - Criando Webservices ultra rápidos com PHP Phalcon e MongoDB
MongoDB + PHP
-
Upload
ari-stopassola-junior -
Category
Software
-
view
142 -
download
0
Transcript of MongoDB + PHP
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• MongoDB leva 12 horas (95% a menos)
Fonte:http://www.mongodb.com/press/mongodb-powers-critical-eharmony-compatibility-application-processing-1-billion-matches-dail-0http://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
MongoDBhttp://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 MongoDBDatabase DatabaseTable CollectionIndex IndexRow DocumentColumn FieldJoining Embedding & linkingPartition 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 Linux1) Baixe o binário do MongoDB em http://www.mongodb.org/
downloadsDescompacte 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/pathsAdicione 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:\data\db
cd ..\..md datamd data\db
• Execute o deamon do MongoDB:c:\mongodb\bin\mongod.exe
• Em outra console execute o client:c:\mongodb\bin\mongo.exe
Fonte: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/
Driver para PHPhttps://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/php/
Foto: http://steve.maraspin.net/photo/gallery/conferences/2012-phpday-verona-italy/
Instalação do driver PHP para mongoDBhttp://pecl.php.net/package/mongo
# sudo pecl install mongoAdicione a linha extension=mongo.so no php.ini
http:
//so
upfo
rthe
girly
soul
.blo
gspo
t.com
.br/
2012
/03/
sund
ay-s
mile
s-op
timis
m-o
ppor
tuni
sts-
and.
htm
l
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/mongoclient.html
phpMoAdmin1. 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çãoDocumento == 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 notationdb.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)
<?phpclass 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!)
<?phpclass 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 DBRefDefiniçã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 ObjectIdObjectId("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=51b278e1fc431ab4f7484cd7
ou (via mod_rewrite)www.site.com.br/conteudo/51b278e1fc431ab4f7484cd7
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 php.inimongo.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 itACID 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));– Aceito em insert, update, remove e save
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çãoEspecifica 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 Enhancementshttps://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 3https://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çãohttp://docs.mongodb.org/ecosystem/tools/administration-interfaces
/
• Fang of Mongohttps://github.com/Fiedzia/Fang-of-Mongo
• Umongohttp://edgytech.com/umongo/
• MongoHubhttp://mongohub.todayclose.com/
• RockMongo• Genghis• Mongobird• RoboMongo
• MongoVUEhttp://www.mongovue.com
• Opricothttps://github.com/argon/Opricot-MongoConsole
• MongoVisionhttps://code.google.com/p/mongo-vision/
mongoOWLhttp://mongoowl.citsoft.net
Vasta bibliografia…
Programa de certificação
• C100DBAMongoDB Certified DBA Associate Exam
• C100DEVMongoDB Certified Developer Associate Exam
• 90 minutos de duração• US$ 150
Referências
• http://nosql-database.org/• http://www.php.net/manual/en/
mongo.tutorial.php• https://mongolab.com• Learning MongoDB – Tuts+
http://code.tutsplus.com/courses/learning-mongodb
• Curso da Infinite Skills com Doug Biererhttp://www.infiniteskills.com/training/learning-mongodb.html
E-mail:[email protected]
Twitter: @stopassolaSkype: stopassolaLinkedIn:
http://pt.linkedin.com/in/stopassola
Facebook:http://www.facebook.com/arijunior
Sites:http://www.perito.inf.brhttp://www.certificamp.com http://www.rumoacertificacaophp.com
Contatos
proud sponsor