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'=>'
[email protected]'}
}
DOCUMENTOS MS COMPLEJOS
Representacin en php
$doc = array ( '_id => 'aristi',
'name' => 'Sebastian Aristizabal',
'friends' => array ( 'Pablo , 'Yeny' ),
'followers => 18,
'contact => array ('twitter' => '@arystyzabal',
'email => '
[email protected] )
);
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