You are on page 1of 30

MONGODB & PHP

Yohan Sebastian Aristizabal Murillo


Estudiante de Ingeniera en Sistemas y Computacin
Universidad de Caldas
CUL ES EL CONTENIDO?
Qu es una base de datos NoSQL?
Descripcin general de MongoDB
Configuracin e instalacin de MongoDB + PHP
en Linux
Manipulacin de MongoDB desde PHP

QU ES UNA BASE DE DATOS NOSQL?
Las bases de datos NoSQL son sistemas de almacenamiento de
informacin que no cumplen con el esquema entidad-relacin.

Mientras que las bases de datos relacionales basan su funcionamiento
en tablas, joins y transacciones ACID, las bases de datos NoSQL no
imponen una estructura de datos en forma de tablas y relaciones entre
ellas, ya que suelen permitir almacenar informacin en otros formatos
como clave-valor, Mapeo de Columnas, Documentos o Grafos.

La principal caracterstica de las bases de datos NoSQL es que estn
pensadas para manipular enormes cantidades de informacin de
manera muy rpida. Estn preparadas para escalar horizontalmente sin
perder rendimiento.
CLASIFICACIN DE LAS BD NOSQL
Se clasifican segn su fuente de datos:

Clave-valor: Redis
Mapeo de Columnas:Hbase
Documentos: MongoDB
Grafos: Neo4j
DESCRIPCIN GENERAL DE MONGODB
MongoDB es una solucin escalable y de alto
rendimiento, es una base de datos de cdigo
abierto, escrita en C++.
Sus caractersticas principales son:
Orientada a documentos(almacenamiento
BSON).
arrays y documentos anidados
ndices para realizar consultas mas rpidas



QU ES MONGODB?
Orientada a documentos
QU ES MONGODB?
Las colecciones son bsicamente bolsas de
documentos, o bolsas de objetos JSON

Diferentes campos
Diferentes tamaos
Indexables

INSTALACIN MONGODB
Descargar la versin desde
http://www.mongodb.org/downloads

En Linux:
# creamos un directorio por defecto para los datos
$ sudo mkdir -p /data/db

# usamos curl, para obtener la ultima versin:
$ curl -O http://downloads.mongodb.org/linux/mongodb-linux-i686-
latest.tgz

# desempaquetamos en el directorio deseado y listo.
$ tar xzf mongodb-linux-i686-latest.tgz
INSTALACIN MONGODB
Instalar PHP Driver:
$ sudo apt-get install php5-dev php5-cli php-pear
$ sudo pecl install mongo

Abrir el archivo php.ini y adicionar:
extension=mongo.so
ESTABLECIENDO UNA CONEXIN
<?php
//conecta a localhost:27017
$connection = new Mongo();

//conecta a un host remoto (puerto por omisin: 27017)
$connection = new Mongo( "example.com" );

// conecta a un host remoto en el puerto facilitado
$connection = new Mongo( example.com:65432" );
?>

Conexin persistente

<?php
$connection = new Mongo("localhost:27017", array("persist" => "x"));
?>
CMO GUARDAMOS UN DOCUMENTO?
<?php
try{
$mongo= new Mongo("localhost:27017", array("persist" => "x"));
$db = $mongo->comedy;
$collection = $db->cartoons;

$obj = array( " title " => "Calvin and Hobbes", "author" => "Bill Watterson" );
$collection->insert($obj);

$obj = array( "title" => "XKCD", "online" => true );
$collection->insert($obj);

$cursor = $collection->find();
foreach ($cursor as $obj) {
echo $obj["title"] . "\n";
}
} catch (MongoCursorException $e) {
die("Query failed " . $e -> getMessage());
}
AL GUARDAR:
Cuando insertamos los documentos, sucede lo
siguiente:
La BD comedy es creada
La coleccin cartoons es creada
Se crea un ndice en el campo _id
Se crean y se adiciona un _id para cada
documento
DOCUMENTOS MS COMPLEJOS
Representacin en JSON

{
'_id:'aristi',
'name:'Sebastian Aristizabal,
'friends': ['Pablo', 'Yeny'],
'followers:18,
'contact:{'twitter'=>'@arystyzabal',
'email'=>'sebaris@gmail.com'}
}
DOCUMENTOS MS COMPLEJOS
Representacin en php

$doc = array ( '_id => 'aristi',
'name' => 'Sebastian Aristizabal',
'friends' => array ( 'Pablo , 'Yeny' ),
'followers => 18,
'contact => array ('twitter' => '@arystyzabal',
'email => 'sebaris@gmail.com
)
);
ALGUNAS CONSULTAS BASICAS
//Consulta bsica
$query=array( '_id' => 'aristi' );
$result=$collection->findOne($query);

//Consulta en array
$query=array( 'friends' => 'Pablo' );
$result=$collection->findOne($query);

//Consulta en documento anidado
$query=array( 'contact.twitter' => '@arystyzabal' );
$result=$collection->findOne($query);

ESPECIFICANDO CAMPOS
Las consultas se pueden llevar a cabo
especificando que campos quiero retornar.

$query = array( '_id' => 'aristi' );
$fields = array( '_id => 0, 'name => 1, 'friends => 1 );
$result = $collection -> findOne ( $query, $fields );
ALGUNAS CONSULTAS AVANZADAS
mayor que ($gt), menor que ($lt), mayor o igual que ($gte),
menor o igual que ($lte)

$query = array ( 'friends' => array ( '$gt' => 10 ) );
$result = $collection->find( $query );

IN ($in), no IN ($nin)

$query = array ( '_id' =>
array ( '$in' => array( 'aristi', 'ar' ) )
);
$result = $collection->find( $query );


ALGUNAS CONSULTAS AVANZADAS
$or y $and
$query = array ( '$or' => array (
array ( '_id' => 'aristi'),
array ( 'name' => 'Roberto')
));
$result = $collection->find( $query );

$ne
$query = array ( '_id' => array ( '$ne' => 'pepe'));
$result = $collection->find( $query );

Tambin soporta $exists. $mod, $type, $size
RESULTADOS DE LAS CONSULTAS
El resultado de un find() es un cursor
Los cursores se pueden manejar con foreach

$collection->insert( array ( 'x' => 1 ));
$collection->insert( array ( 'x' => 2 ));
$collection->insert( array ( 'x' => 3 ));

$results = $collection->find();
foreach ($results as $r) {
print_r($r);
}
RESULTADOS DE LAS CONSULTAS
Los cursores se pueden trabajar con un ciclo while

$collection->insert( array ( 'x' => 1 ));
$collection->insert( array ( 'x' => 2 ));
$collection->insert( array ( 'x' => 3 ));

$results = $collection->find();
while ( $results->hasNext()) {
$r = $results->getNext();
print_r($r);
}
FUNCIONES BASICAS SOBRE CURSORES
Los cursores se pueden contar, limitar, ordenar
$collection->insert( array ( 'x' => 1 ));
$collection->insert( array ( 'x' => 2 ));
$collection->insert( array ( 'x' => 3 ));

print($collection->find()->count()); //3
$res = $collection->find()->limit(1); // x=>1
$res2 = $collection->find()->skip(1)->limit(1); // x=>2
$res3 = $collection->find()->sort(array ( 'x' => 1 ));
ACTUALIZACIN DE DOCUMENTOS
Consultas + comandos de actualizacin
//Tiene un comportamiento inesperado
$query = array( '_id' => 'aristi');
$update = array( 'followers' => '19' );
$collection->update( $query, $update);

//pero si se realiza as
$query = array( '_id' => 'aristi');
$update = array( '$set' => array('followers' => '19' ));
$collection->update( $query, $update);
ACTUALIZACIN DE DOCUMENTOS
Otras operaciones

$query = array( '_id' => 'aristi');
$update = array(
'$set' => array('name' => 'Sebastian',
'contact.website' => 'http://sebas.com/'),
'$inc' => array( 'followers' => 1 ),
'$push' => array( 'friends' => 'Juan' ),
'$unset' => array( 'contact.twitter' => 1)
);
$collection->update( $query, $update);
MAS INFORMACIN SOBRE ACTUALIZACIONES
Otros operadores existentes son: $pop, $pull,
$addToSet, $rename.

Los operadores son atmicos con los
documentos.

Solo se puede llevar a cabo una operacin por
campo, es decir no se puede hacer $pop &
$pull a una array en un mismo comando
ACTUALIZACIONES MULTIPLES
Por defecto solo el primer documento es actualizado,
pero se puede cambiar solo agregando una opcin

$collection->insert( array ( 'x' => 1 ));
$collection->insert( array ( 'x' => 1 ));
$collection->insert( array ( 'x' => 3 ));

$query = array( x' => 1);
$update = array( '$inc' => array( 'x' => 1));
$option = array( 'multiple' => TRUE);
$collection->update( $query, $update, $option);



CREAR REFERENCIAS ENTRE DOCUMENTOS DE
DIFERENTES COLECCIONES
Representacin en JSON
{
"_id" : ObjectId("4f8c8e1371cbc84715000002"),
"activeUser" : {
"$ref" : "user",
"$id" : ObjectId("4f8c8c3671cbc84c15000000")
},
"publishingDate" : "2012-04-16 16:24:35",
"activatingElement" : "follow",
"privacyLevel" : "public "
}

CMO SE HACE EN PHP?
$collection = $db->user;
$query = array( name => Sebastian);
$user = $collection -> findOne ( $query);
$reference = $collection->createDBRef($user);

$collection = $db->activity;
$doc = array (
'_id' => new MongoId( '4f8c8e1371cbc84715000002 ' ),
'activeUser' => $reference,
'publishingDate' : '2012-04-16 16:24:35 ',
'activatingElement' : 'follow',
'privacyLevel' : 'public'
);
$collection->insert($doc);

CONSULTAR LOS DATOS DE UN DOCUMENTO
REFERENCIADO
$result = $collection->findOne(_id => new
MongoId('4f8c8e1371cbc84715000002 );

$resultReference = $db->getDBRef($result[activeUser])
BORRAR DOCUMENTOS
Borrar toda la coleccin
$collection->remove();

Borrar un documento de la coleccin
$query = array( x => 1 );
$collection->remove( $query );
Borra donde x=1