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.
3. ¿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
6. ServerGrove!
⁃ 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!
Saturday, June 16, 2012
7. La comunidad es nuestra guia
⁃ Muy activos en la comunidad de Open Source
contribuyendo con código o patrocinando eventos y
grupos de usuarios
Saturday, June 16, 2012
8. Agenda
- Introducción a MongoDB
- PHP y MongoDB
- Librerías en PHP
- Symfony2 y MongoDB
Saturday, June 16, 2012
10. Mongo
Mongo viene de "humongous". Usado para
describir algo extremadamente grande o
importante
Saturday, June 16, 2012
11. 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
12. Descripción
- 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
Saturday, June 16, 2012
13. Orientada a Objetos
¿Vienes de SQL?
Base de datos => Base de datos
Tabla => Colección
Fila => Documento
Saturday, June 16, 2012
24. GridFS
- Archivos son divididos en “chunks” o partes y son
guardados en múltiples documentos
- API transparente
Saturday, June 16, 2012
25. Replicación
Source: http://www.mongodb.org/display/DOCS/Replication
Saturday, June 16, 2012
26. Shards
Source: http://www.mongodb.org/display/DOCS/Introduction
Saturday, June 16, 2012
27. Simple instalación con cero configuración
OS X
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
Saturday, June 16, 2012
28. Simple instalación con cero configuración
CentOS Linux
/etc/yum.repos.d/10gen.repo
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
$ yum install -y mongo-stable-server
$ service mongod start
Saturday, June 16, 2012
36. Rendimiento
VELOZ
by xavi talleda
Saturday, June 16, 2012
37. Rendimiento
ESCALABILIDAD
by Jimee, Jackie, Tom & Asha
Saturday, June 16, 2012
38. Ojo al piojo!
- No hay transacciones
- No hay rollbacks
- Valores inseguros
por defecto
- Locks en Map Reduce
by Ernst Vikne
Saturday, June 16, 2012
39. Buenas aplicaciones
- Sistema de manejo de contenidos (CMS)
- Catálogos de productos
- Análisis en tiempo real
- Almacenamiento de logs
Saturday, June 16, 2012
41. Driver de PECL
Linux
pecl install mongo
echo “extension=mongo.so >> /path/php.ini”
OS X
http://php-osx.liip.ch/
Windows
https://github.com/mongodb/mongo-php-driver/downloads
Saturday, June 16, 2012
42. Uso
<?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 resultados
foreach ($cursor as $obj) {
echo $obj["titulo"] . "n";
}
?>
Saturday, June 16, 2012
43. Almacenamiento de Archivos
<?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)));
?>
Saturday, June 16, 2012
44. Queries de SQL a Mongo
http://php.net/manual/es/mongo.sqltomongo.php
Saturday, June 16, 2012
50. Librerias en PHP
- Doctrine ODM
- Mandango
Saturday, June 16, 2012
51. Librerias en PHP
- Doctrine ODM
- Mandango
- varias más...
Saturday, June 16, 2012
52. 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
53. Doctrine MongoDB ODM
Tipos de Mappings
bin_data_custom float
bin_data_func hash
bin_data_md5 id
bin_data int
bin_data_uuid key
boolean string
date timestamp
file increment
Saturday, June 16, 2012
54. Doctrine MongoDB ODM
Tipos de Mappings
bin_data_custom float
bin_data_func hash
bin_data_md5 id
bin_data int
bin_data_uuid key
boolean string
date timestamp
file increment
Saturday, June 16, 2012
55. Doctrine MongoDB ODM
Tipos de Mappings
bin_data_custom float
bin_data_func hash
bin_data_md5 id
bin_data int
bin_data_uuid key
boolean string
date timestamp
file increment
Saturday, June 16, 2012
56. Doctrine MongoDB ODM
Tipos de Mappings
bin_data_custom float
bin_data_func hash
bin_data_md5 id
bin_data int
bin_data_uuid key
boolean string
date timestamp
file increment
Saturday, June 16, 2012
57. Doctrine MongoDB ODM
Tipos de Mappings
bin_data_custom float
bin_data_func hash
bin_data_md5 id
bin_data int
bin_data_uuid key
boolean string
date timestamp
file increment
Saturday, June 16, 2012
58. Doctrine MongoDB ODM
Tipos de Mappings
bin_data_custom float
bin_data_func hash
bin_data_md5 id
bin_data int
bin_data_uuid key
boolean string
date timestamp
file increment
Saturday, June 16, 2012
59. Doctrine MongoDB ODM
Tipos de Mappings
bin_data_custom float
bin_data_func hash
bin_data_md5 id
bin_data int
bin_data_uuid key
boolean string
date timestamp
file increment
Saturday, June 16, 2012
60. Doctrine MongoDB ODM
Tipos de Mappings
bin_data_custom float
bin_data_func hash
bin_data_md5 id
bin_data int
bin_data_uuid key
boolean string
date timestamp
file increment
Saturday, June 16, 2012
61. Doctrine MongoDB ODM
Campos “AutoIncrement”
<?php
/** Document */
class MiClase
{
/** @Id(strategy="INCREMENT") */
private $id;
public function getId()
{
return $this->id;
}
//...
}
Saturday, June 16, 2012
62. Doctrine MongoDB ODM
Tipos propios
<?php
namespace MyProjectTypes;
use DoctrineDBALTypesType;
use DoctrineDBALPlatformsAbstractPlatform;
/**
* 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
63. Doctrine MongoDB ODM
Mú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
66. Doctrine MongoDB ODM
<?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();
Saturday, June 16, 2012
67. Doctrine MongoDB ODM
<?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);
Saturday, June 16, 2012
68. Doctrine MongoDB ODM
<?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);
Saturday, June 16, 2012
69. Doctrine MongoDB ODM
Array
(
[_id] => 4bec5869fdc212081d000000
[titulo] => My First Blog Post
[contenido] => MongoDB + Doctrine 2 ODM = awesomeness!
[createdAt] => MongoDate Object
(
[sec] => 1273723200
[usec] => 0
)
)
Saturday, June 16, 2012
85. DoctrineMongoDBBundle
Definiendo Documentos
// src/Acme/StoreBundle/Document/Product.php
namespace AcmeStoreBundleDocument;
use DoctrineODMMongoDBMappingAnnotations as MongoDB;
/**
* @MongoDBDocument(collection="product")
*/
class Product
{
/**
* @MongoDBId
*/
protected $id;
/**
* @MongoDBString @MongoDBIndex(unique=true, order="asc")
*/
protected $name;
Saturday, June 16, 2012
86. DoctrineMongoDBBundle
Usando Documentos
// src/Acme/StoreBundle/Controller/DefaultController.php
use AcmeStoreBundleDocumentProduct;
use SymfonyComponentHttpFoundationResponse;
// ...
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());
}
Saturday, June 16, 2012
87. DoctrineMongoDBBundle
Consumiendo Mongo directamente
// src/Acme/StoreBundle/Controller/DefaultController.php
use SymfonyComponentHttpFoundationResponse;
// ...
public function createAction()
{
$dm = $this->get('doctrine.odm.mongodb.document_manager');
$mongo = $dm->getConnection()->getMongo());
$resultado = $mongo->miBD->miColleccion->find();
...
Saturday, June 16, 2012
88. Formularios
Debido 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
89. Comandos
Comandos de Symfony2
doctrine
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
Saturday, June 16, 2012
90. Bundles que usan MongoDB
- SonataDoctrineMongoDBAdminBundle
- IsmaAmbrosiGeneratorBundle
- EbutikMongoSessionBundle
- TranslationEditorBundle
- ServerGroveLiveChat
Saturday, June 16, 2012