View
6.125
Download
2
Category
Preview:
DESCRIPTION
MongoDB es un motor de base de datos NoSQL que ha ganado mucha popularidad en los últimos tiempos, ya que ofrece muchos beneficios a la hora de desarrollar aplicaciones web. En esta charla daremos una breve introducción a su instalación, configuración y funcionamiento. Luego repasaremos las distintas alternativas a la hora de usarlo en nuestras aplicaciones desarrolladas con PHP y Symfony2, y explicaremos cómo puede incrementar la velocidad de desarrollo y ayudar con aplicaciones web de alto rendimiento.
Citation preview
Saturday, June 16, 2012
Saturday, June 16, 2012
¿Quién soy?
⁃ Argentino viviendo en Estados Unidos desde 1999⁃ Desarrollador PHP & Symfony
⁃ Fundador de la primera lista de discusión de PHP de habla hispana
- Socio fundador de ServerGrove ⁃ Maestro de la parrilla
Saturday, June 16, 2012
Saturday, June 16, 2012
Saturday, June 16, 2012
⁃ Fundada en 2005
⁃ Proveedor de servicios de hosting especializado en PHP, Symfony, ZendFramework, y otros
⁃ Servidores en Europa y Estados Unidos
⁃ Mongohosting.com en beta!
ServerGrove!
Saturday, June 16, 2012
⁃ Muy activos en la comunidad de Open Source contribuyendo con código o patrocinando eventos y grupos de usuarios
La comunidad es nuestra guia
Saturday, June 16, 2012
Agenda
- Introducción a MongoDB- PHP y MongoDB- Librerías en PHP- Symfony2 y MongoDB
Saturday, June 16, 2012
¿Qué es MongoDB?
¿Quién es 10Gen?
Saturday, June 16, 2012
MongoMongo viene de "humongous". Usado para describir algo extremadamente grande o importante
Saturday, June 16, 2012
MongoDB es una base de datos NoSQL, escalable, de alta performance
y de código abierto.
- BD orientada a documentos- Escrita en C++
- Disponible en *nux (Linux, Solaris, etc), Windows y OS X
- Muchos drivers (PHP, Java, Python, Ruby...)
Saturday, June 16, 2012
- Documentos flexibles tipo JSON- Soporte completo de Indices- Queries complejos / Map Reduce- Framework de agregación (próximamente)- GridFS (almacena archivos nativamente)- Múltiples opciones de replicación- Sharding- Instalación sencilla con cero configuración
Descripción
Saturday, June 16, 2012
Base de datos => Base de datosTabla => ColecciónFila => Documento
¿Vienes de SQL?
Orientada a Objetos
Saturday, June 16, 2012
{ nombre: { primero: 'Juan', apellido: 'Perez' }, titulo: 'Ingeniero', edad: 40}
Documentos Tipo JSON
Saturday, June 16, 2012
Sin Schema o Tablas Fijas
{ nombre: { primero: 'Juan', apellido: 'Perez' }, titulo: 'Ingeniero', edad: 40, escuela: 'UJI'}
Saturday, June 16, 2012
{ "_id" : ObjectId("4ccba15ef597e9352e060000") "srcFilename" : "/etc/apache2/sites-enabled/example1.com", "vhostDirective" : { "directives" : [ { "name" : "CustomLog", "value" : "logs/example1.com-access_log combined" }, { "name" : "DocumentRoot", "value" : "/var/www/vhosts/example1.com/httpdocs" }, { "name" : "ServerName", "value" : "example1.com" } ] } }
Documentos Embebidos
Saturday, June 16, 2012
{ "_id" : ObjectId("4cc4a5c3f597e9db6e010109"), "billingId" : NumberLong(650), "created" : ISODate("2010-10-24T21:31:47Z"), "servers" : [ { "$ref" : "server", "$id" : ObjectId("4cc4a5c4f597e9db6e050201") }], "users" : [ { "$ref" : "user", "$id" : ObjectId("4cc4a5c4f597e9db6e980201") }, { "$ref" : "user", "$id" : ObjectId("4cc4a5c4f597e9db6e9c0201") }] }
Referencias Entre Documentos
Saturday, June 16, 2012
db.personal.ensureIndex({nombre: 1})
db. personal.ensureIndex({nombre.primer: 1, nombre.apellido: 1})
db. personal.ensureIndex({edad: 0})
Indices
Saturday, June 16, 2012
db.personal.ensureIndex({nombre: 1})
db. personal.ensureIndex({nombre.primer: 1, nombre.apellido: 1})
db. personal.ensureIndex({edad: 0})
Indices
Saturday, June 16, 2012
db.personal.ensureIndex({nombre: 1})
db. personal.ensureIndex({nombre.primer: 1, nombre.apellido: 1})
db. personal.ensureIndex({edad: 0})
Indices
Saturday, June 16, 2012
db. personal.find({nombre: 'Juan'})
db. personal.find({tags: 'symfony'})
db. personal.find({tags: {$in: ['symfony', 'PHP']}}
Consultas
Saturday, June 16, 2012
db. personal.find({nombre: 'Juan'})
db. personal.find({tags: 'symfony'})
db. personal.find({tags: {$in: ['symfony', 'PHP']}}
Consultas
Saturday, June 16, 2012
db. personal.find({nombre: 'Juan'})
db. personal.find({tags: 'symfony'})
db. personal.find({tags: {$in: ['symfony', 'PHP']}}
Consultas
Saturday, June 16, 2012
- Archivos son divididos en “chunks” o partes y son guardados en múltiples documentos
- API transparente
GridFS
Saturday, June 16, 2012
Source: http://www.mongodb.org/display/DOCS/Replication
Replicación
Saturday, June 16, 2012
Source: http://www.mongodb.org/display/DOCS/Introduction
Shards
Saturday, June 16, 2012
wget http://fastdl.mongodb.org/osx/mongodb-osx-x86_64-2.0.4.tgz
tar zxvf mongodb-osx-x86_64-2.0.4.tgz
cd mongodb-osx-x86_64-2.0.4
./mongod
OS X
Simple instalación con cero configuración
Saturday, June 16, 2012
/etc/yum.repos.d/10gen.repo
CentOS Linux
[10gen]name=10gen Repositorybaseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64gpgcheck=0
$ yum install -y mongo-stable-server$ service mongod start
Simple instalación con cero configuración
Saturday, June 16, 2012
mongodumpmongodump -u usuario -p pass
Backups
mongorestoremongorestore -u usuario -p pass
mongoexportmongoexport -u usuario -p pass
mongoimportmongoimport -u usuario -p pass
Saturday, June 16, 2012
Monitoreomongostat
Saturday, June 16, 2012
http://localhost:28017/Monitoreo
Saturday, June 16, 2012
¿Por qué MongoDB es bueno para el desarrollo rápido de
aplicacones web?
Saturday, June 16, 2012
FLEXIBLE
by exfordy
Desarrollo Rápido de Aplicaciones
Sin schema / orientada a documentos
Saturday, June 16, 2012
MIGRACIONES MAS FACILES
by exfordy
Desarrollo Rápido de Aplicaciones
Sin schema / orientada a documentos
Saturday, June 16, 2012
Desarrollo Rápido de Aplicaciones
NO HAY JOINS!
Saturday, June 16, 2012
VELOZ
by xavi talleda
Rendimiento
Saturday, June 16, 2012
ESCALABILIDAD
by Jimee, Jackie, Tom & Asha
Rendimiento
Saturday, June 16, 2012
- No hay transacciones- No hay rollbacks- Valores inseguros por defecto- Locks en Map Reduce
Ojo al piojo!
by Ernst Vikne
Saturday, June 16, 2012
Buenas aplicaciones
- Sistema de manejo de contenidos (CMS)
- Catálogos de productos
- Análisis en tiempo real
- Almacenamiento de logs
Saturday, June 16, 2012
y
Saturday, June 16, 2012
Driver de PECL
pecl install mongoecho “extension=mongo.so >> /path/php.ini”
Linux
OS X
Windowshttps://github.com/mongodb/mongo-php-driver/downloads
http://php-osx.liip.ch/
Saturday, June 16, 2012
<?php
// conectar$m = new Mongo();
// seleccionar una base de datos$db = $m->biblioteca;
// seleccionar una coleccón $collection = $db->libros;
// agregar un documento$obj = array( "titulo" => "RabbitMQ in Action", "autor" => "Alvaro Videla" );$collection->insert($obj);
// agregar otro documento con distintos datos$obj = array( "titulo" => "Desarrollo en Symfony", "pdf" => true );$collection->insert($obj);
// obtener todos los documentos en la colección$cursor = $collection->find();
// iterar los resultadosforeach ($cursor as $obj) { echo $obj["titulo"] . "\n";}
?>
Uso
Saturday, June 16, 2012
<?php
// guardar un archivo$id = $grid->storeFile("libro.pdf");$libro = $grid->findOne();
// agregar un contador de descargas$libro->file['descargas'] = 0;$grid->save($libro->file);
// incrementar el contador$grid->update(array("_id" => $id), array('$inc' => array("descargas" => 1)));
?>
Almacenamiento de Archivos
Saturday, June 16, 2012
http://php.net/manual/es/mongo.sqltomongo.php
Queries de SQL a Mongo
Saturday, June 16, 2012
Interfaces de Administración- Genghis
http://genghisapp.com/
Saturday, June 16, 2012
- RockMongo
http://code.google.com/p/rock-php/wiki/rock_mongo
Interfaces de Administración
Saturday, June 16, 2012
- php-mongodb-admin
https://github.com/jwage/php-mongodb-admin
Interfaces de Administración
Saturday, June 16, 2012
- mongohosting.com
https://github.com/jwage/php-mongodb-admin
Interfaces de Administración
Saturday, June 16, 2012
- Doctrine ODM
Librerias en PHP
Saturday, June 16, 2012
- Doctrine ODM
- Mandango
Librerias en PHP
Saturday, June 16, 2012
- Doctrine ODM
- Mandango
- varias más...
Librerias en PHP
Saturday, June 16, 2012
Doctrine MongoDB ODM
http://doctrine-project.org
Doctrine MongoDB Object Document Mapper (ODM) está desarrollado para PHP 5.3.2+ y
provee persistencia transparente de objetos PHP.
Saturday, June 16, 2012
Doctrine MongoDB ODM
bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile
Tipos de Mappings
float hashidintkeystringtimestampincrement
Saturday, June 16, 2012
Doctrine MongoDB ODM
bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile
Tipos de Mappings
float hashidintkeystringtimestampincrement
Saturday, June 16, 2012
Doctrine MongoDB ODM
bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile
Tipos de Mappings
float hashidintkeystringtimestampincrement
Saturday, June 16, 2012
Doctrine MongoDB ODM
bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile
Tipos de Mappings
float hashidintkeystringtimestampincrement
Saturday, June 16, 2012
Doctrine MongoDB ODM
bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile
Tipos de Mappings
float hashidintkeystringtimestampincrement
Saturday, June 16, 2012
Doctrine MongoDB ODM
bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile
Tipos de Mappings
float hashidintkeystringtimestampincrement
Saturday, June 16, 2012
Doctrine MongoDB ODM
bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile
Tipos de Mappings
float hashidintkeystringtimestampincrement
Saturday, June 16, 2012
Doctrine MongoDB ODM
bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile
Tipos de Mappings
float hashidintkeystringtimestampincrement
Saturday, June 16, 2012
Doctrine MongoDB ODM
Campos “AutoIncrement”<?php
/** Document */class MiClase{ /** @Id(strategy="INCREMENT") */ private $id;
public function getId() { return $this->id; }
//...}
Saturday, June 16, 2012
Doctrine MongoDB ODMTipos propios<?php
namespace My\Project\Types;
use Doctrine\DBAL\Types\Type;use Doctrine\DBAL\Platforms\AbstractPlatform;
/** * My custom datatype. */class MyType extends Type{ public function convertToPHPValue($value) { // This is executed when the value is read from the database. Make your conversions here. }
public function convertToDatabaseValue($value) { // This is executed when the value is written to the database. Make your conversions here. }}
Saturday, June 16, 2012
Doctrine MongoDB ODMMúltiples tipos en una misma colección/** * @Document(collection="documentos") * @DiscriminatorField(fieldName="type") * @DiscriminatorMap({"article"="Articulo", "album"="Album"}) */class Articulo{ // ...}
/** * @Document(collection="documentos") * @DiscriminatorField(fieldName="type") * @DiscriminatorMap({"article"="Articulo", "album"="Album"}) */class Album{ // ...}
Saturday, June 16, 2012
/** @Document */class Usuario{ /** @Id */ private $id;
/** @String */ private $nombre;
/** @String */ private $email;
/** @ReferenceMany(targetDocument="Articulo", cascade="all") */ private $articulos = array();
// ...}
Doctrine MongoDB ODM
Saturday, June 16, 2012
/** @Document */class Articulo{ /** @Id */ private $id;
/** @String */ private $titulo;
/** @String */ private $contenido;
/** @Date */ private $createdAt;
// ...}
Doctrine MongoDB ODM
Saturday, June 16, 2012
<?php
// crear un usuario$user = new Usuario();$user->setNombre('Juan P.');$user->setEmail('email@example.com');
// avisale a Doctrine2 que guarde $usuario en el próximo flush()$dm->persist($usuario);
// crear un articulo$articulo = new Articulo();$articulo->setTitulo('Mi primer articulo');$articulo->setContenido('MongoDB + Doctrine 2 ODM = espectacular!');$articulo->setCreatedAt(new DateTime());
$user->agregarArticulo($articulo);
// guarda todo en MongoDB$dm->flush();
Doctrine MongoDB ODM
Saturday, June 16, 2012
<?php
// crear un usuario$usuario = new Usuario();$usuario->setNombre('Juan P.');$usuario->setEmail('email@example.com');
// avisale a Doctrine2 que guarde $usuario en el próximo flush()$dm->persist($usuario);
// crear un articulo$articulo = new Articulo();$articulo->setTitulo('Mi primer articulo');$articulo->setContenido('MongoDB + Doctrine 2 ODM = espectacular!');$articulo->setCreatedAt(new DateTime());
$user->addArticulo($articulo);
// guarda todo en MongoDB$dm->flush($usuario);
Doctrine MongoDB ODM
Saturday, June 16, 2012
<?php
// crear un usuario$user = new Usuario();$user->setNombre('Juan P.');$user->setEmail('email@example.com');
// avisale a Doctrine2 que guarde $usuario en el próximo flush()$dm->persist($usuario);
// crear un articulo$articulo = new Articulo();$articulo->setTitulo('Mi primer articulo');$articulo->setContenido('MongoDB + Doctrine 2 ODM = espectacular!');$articulo->setCreatedAt(new DateTime());
$user->agregarArticulo($articulo);
// guarda todo en MongoDB$dm->flush($usuario, false);
Doctrine MongoDB ODM
Saturday, June 16, 2012
Array( [_id] => 4bec5869fdc212081d000000 [titulo] => My First Blog Post [contenido] => MongoDB + Doctrine 2 ODM = awesomeness! [createdAt] => MongoDate Object ( [sec] => 1273723200 [usec] => 0 ))
Doctrine MongoDB ODM
Saturday, June 16, 2012
Array( [_id] => 4bec5869fdc212081d010000 [nombre] => Bulat S. [email] => email@example.com [articulos] => Array ( [0] => Array ( [$ref] => Articulo [$id] => 4bec5869fdc212081d000000 [$db] => test_database ) ))
Doctrine MongoDB ODM
Saturday, June 16, 2012
$usuario = $dm->find('Usuario', $idDelUsuario);
$usuario = $dm->getRepository('Usuario')->findOneByNombre('Juan');
$articulos = $usuario->getArticulos();foreach ($articulos as $articulo) { echo $articulo;}
Doctrine MongoDB ODM
Saturday, June 16, 2012
// src/TuNamespace/TuBundle/ServerRepository.phpnamespace TuNamespace\TuBundle;
use Doctrine\ODM\MongoDB\DocumentRepository;
class ServerRepository extends DocumentRepository{ public function getActiveServers() { return $this->createQueryBuilder() ->field('isActive')->equals(true) ->sort('name', 'asc')->getQuery()->execute(); }
Repositorios de documents
$rep = $dm->getRepository(‘@TuBundle/Server’);$servers = $rep->getActiveServers();
Usage
Doctrine MongoDB ODM
Saturday, June 16, 2012
/** @Document */class Imagen{ /** @Id */ private $id;
/** @Field */ private $nombre;
/** @File */ private $file;
Doctrine MongoDB ODM
Saturday, June 16, 2012
// guardar archivo$imagen = new Imagen();$imagen->setNombre('Imagen de prueba');$imagen->setFile('/path/to/imagen.png');
$dm->persist($imagen);$dm->flush();
// obtener documento y enviar archivo al cliente HTTP$imagen = $dm->createQueryBuilder('Documents\Imagen') ->field('nombre')->equals('Imagen de prueba') ->getQuery() ->getSingleResult();
header('Content-type: image/png;');echo $imagen->getFile()->getBytes();
Doctrine MongoDB ODM
Saturday, June 16, 2012
Saturday, June 16, 2012
¡No necesita introducción!
Saturday, June 16, 2012
Bundles de Symfony2
- DoctrineMongoDBBundle
Saturday, June 16, 2012
Bundles de Symfony2
- DoctrineMongoDBBundle
- MandangoBundle
Saturday, June 16, 2012
DoctrineMongoDBBundle
Instalación en Symfony 2.0
[doctrine-mongodb] git=http://github.com/doctrine/mongodb.git
[doctrine-mongodb-odm] git=http://github.com/doctrine/mongodb-odm.git
[DoctrineMongoDBBundle] git=http://github.com/doctrine/DoctrineMongoDBBundle.git target=/bundles/Symfony/Bundle/DoctrineMongoDBBundle version=v2.0.0
$ ./bin/vendors install
deps
Saturday, June 16, 2012
DoctrineMongoDBBundle
Instalación en Symfony 2.1 con Composer
{ require: { "doctrine/mongodb-odm-bundle": "dev-master" }}
$ php composer.phar update
composer.json
Saturday, June 16, 2012
Configurando Symfony2.1
use Doctrine\Common\Annotations\AnnotationRegistry;
AnnotationRegistry::registerFile(__DIR__.'/../vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Mapping/Annotations/DoctrineAnnotations.php');
app/autoload.php
DoctrineMongoDBBundle
Saturday, June 16, 2012
doctrine_mongodb: connections: default: server: mongodb://localhost:27017 options: connect: true default_database: test_database document_managers: default: auto_mapping: true
app/config/config.yml
DoctrineMongoDBBundleConfigurando Symfony2.1
Saturday, June 16, 2012
app/config/config.ymldoctrine_mongodb: connections: default: server: mongodb://localhost:27017 options: connect: true
usage: server: mongodb://user:pass@db1.mongohosting.com:27017 options: replicaSet: true connect: true default_database: test_database document_managers: default: mappings: SGCBundle: ~ SGCRepositoryAppBundle: yml MiBundle: { type: xml, dir: Resources/config/doctrine/mapping }
DoctrineMongoDBBundle
Saturday, June 16, 2012
Definiendo Documentos
DoctrineMongoDBBundle
Saturday, June 16, 2012
Definiendo Documentos// src/Acme/StoreBundle/Document/Product.phpnamespace Acme\StoreBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/** * @MongoDB\Document(collection="product") */class Product{ /** * @MongoDB\Id */ protected $id;
/** * @MongoDB\String @MongoDB\Index(unique=true, order="asc") */ protected $name;
DoctrineMongoDBBundle
Saturday, June 16, 2012
Usando Documentos// src/Acme/StoreBundle/Controller/DefaultController.phpuse Acme\StoreBundle\Document\Product;use Symfony\Component\HttpFoundation\Response;// ...
public function createAction(){ $product = new Product(); $product->setName('A Foo Bar'); $product->setPrice('19.99');
$dm = $this->get('doctrine.odm.mongodb.document_manager'); $dm->persist($product); $dm->flush();
return new Response('Created product id '.$product->getId());}
DoctrineMongoDBBundle
Saturday, June 16, 2012
Consumiendo Mongo directamente// src/Acme/StoreBundle/Controller/DefaultController.phpuse Symfony\Component\HttpFoundation\Response;// ...
public function createAction(){ $dm = $this->get('doctrine.odm.mongodb.document_manager'); $mongo = $dm->getConnection()->getMongo()); $resultado = $mongo->miBD->miColleccion->find();
...
DoctrineMongoDBBundle
Saturday, June 16, 2012
FormulariosDebido a que los documentos son objetos simples de PHP, integrar los formularios es extremadamente sencillo.
public function createAction(){ $dm = $this->get('doctrine.odm.mongodb.default_document_manager');
$form = $this->createForm(new RegistrationType(), new Registration());
$form->bindRequest($this->getRequest());
if ($form->isValid()) { $registration = $form->getData();
$dm->persist($registration->getUser()); $dm->flush();
return $this->redirect(...); }
http://symfony.com/doc/master/bundles/DoctrineMongoDBBundle/form.html
Saturday, June 16, 2012
Comandos de Symfony2doctrine doctrine:mongodb:cache:clear-metadata Clear all metadata cache for a document manager. doctrine:mongodb:fixtures:load Load data fixtures to your database. doctrine:mongodb:generate:documents Generate document classes and method stubs from your mapping information. doctrine:mongodb:generate:hydrators Generates hydrator classes for document classes. doctrine:mongodb:generate:proxies Generates proxy classes for document classes. doctrine:mongodb:generate:repositories Generate repository classes from your mapping information. doctrine:mongodb:mapping:info Show basic information about all mapped documents. doctrine:mongodb:query Query mongodb and inspect the outputted results from your document classes. doctrine:mongodb:schema:create Allows you to create databases, collections and indexes for your documents doctrine:mongodb:schema:drop Allows you to drop databases, collections and indexes for your documents
Comandos
Saturday, June 16, 2012
Bundles que usan MongoDB
- SonataDoctrineMongoDBAdminBundle
- IsmaAmbrosiGeneratorBundle
- EbutikMongoSessionBundle
- TranslationEditorBundle
- ServerGroveLiveChat
Saturday, June 16, 2012
¿Preguntas?
Saturday, June 16, 2012
¡Muchas Gracias!
Transparencias: http://slideshare.net/pgodelTwitter: @pgodel
Saturday, June 16, 2012
Recommended