2012-03-05

Introducción a la base de datos MongoDB en PHP


No voy a entrar en detalles sobre el concepto NoSQL ni a explicar de forma detallada qué es y para que sirve. Si estás leyendo este artículo, doy por hecho que tienes unos conocimientos básicos de PHP y de dases de datos.
Los chicos de GenbetaDev han dedicado dos artículos para explicar el concepto NoSQL y una introducción a MongoDB:
Recomiendo leer los dos artículos citados más arriba si aún se tienen dudas sobre este tipo de bases de datos o sobre MongoDB. En este artículo nos centraremos en el uso de MongoDB desde una aplicación escrita en lenguaje PHP.

Instalar MongoDB

Lo primero que hay que hacer, es descargar desde la página oficial la versión de Mongo correspondiente a nuestro sistema operativo, en mi caso lo instalaré en un sistema operativoWindows de 32 bits. Los desarrolladores nos recomiendan usar la versión de 64 bits (claramente se necesita un Sistema Operativo de 64 bits para que funcione), dado que, la versión de 32 bits solamente permite un tamaño máximo de 2 GB de la base de datos.
Una vez descargada la versión que corresponde a nuestro SO, la descomprimimos en alguna carpeta.
El siguiente paso es crear las carpetas donde MongoDB guardará las bases de datos, es recomendable crearlas en el raíz del disco local. Yo en mi caso, las he creado dentro del disco local C. Hay que crear una carpeta llamada data y dentro de esta carpeta, otra, llamada db.
Si lo hacemos usando la consola, quedaría algo así:
C:\ mkdir \data
C:\ mkdir \data\db
C:\ tree data
C:\>tree data
Listado de rutas de carpetas
El número de serie del volumen es C490-7C5B
C:\DATA
└───db

C:\>
A continuación, nos dirigimos a la carpeta donde hemos descomprimido los archivos descargados anteriormente. Dentro de esa carpeta, lo que más nos interesa es el directorio /bin, dicho directorio podemos agregarlo a la variable de entorno del sistema, si no queremos acceder siempre a esa carpeta cuando queramos arrancar el servidor.
Los ficheros más importantes son mongod.exe y mongo.exe. El primero es el “daemon” o el servidor en si, mientras que el segundo es la consola de administración.
Es posible ejecutar el servidor en modo standalone, pero en nuestro cosa, lo instalaremos como un servicio del sistema, para eso hay que ejecutar el siguiente comando:
C:\mongo\bin>mongod --install  --serviceName MongoDB --serviceUser root --servicePassword root --logpath ..\log\log.txt
Con el parámetro –serviceName le indicamos el nombre que tendrá el servicio, con los dos siguientes, el usuario y la contraseña, mientras que con el último, le indicamos un archivo de texto donde en caso de error, pueda volcar la información de depuración, dicho archivo tiene que estar previamente creado.
Ahora si miramos en los servicios del sistema, observaremos que uno nuevo se ha creado:

Para arrancar el servicio, podemos lanzar en la consola lo siguiente:
net start MongoDB
Pero si no queremos instalarlo como servicio, podemos ejecutar directamente el comando mongod sin ningún parámetro y tendremos el servidor corriendo de forma temporal.
C:\mongo\bin>mongod
mongod --help for help and startup options
Sun Aug 14 18:43:09 [initandlisten] MongoDB starting : pid=192 port=27017 dbpath
=/data/db/ 32-bit

** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data

**       see http://blog.mongodb.org/post/137788967/32-bit-limitations
**       with --dur, the limit is lower

Sun Aug 14 18:43:09 [initandlisten] db version v1.8.2, pdfile version 4.5
Sun Aug 14 18:43:09 [initandlisten] git version: 433bbaa14aaba6860da15bd4de8edf6
00f56501b
Sun Aug 14 18:43:09 [initandlisten] build sys info: windows (5, 1, 2600, 2, 'Ser
vice Pack 3') BOOST_LIB_VERSION=1_35
Sun Aug 14 18:43:09 [initandlisten] waiting for connections on port 27017
Sun Aug 14 18:43:09 [websvr] web admin interface listening on port 28017
Una vez arrancado el servicio, ese es el mensaje que obtendremos. Si accedemos con el navegador web a la dirección http://localhost:28017, veremos información sobre el servidor.
Para crear una base de datos, tendremos que usar el gestor, está en la misma carpeta que el “daemon” y se llama mongo.exe. Lo ejecutamos y veremos información sobre el sistema.
Procedemos a crear una base de datos llamada “php“. Para eso usamos el comando use, seguido del nombre de la base de datos.
La base de datos no se crea al instante, sino, se crea primero en memoria y luego se escribe en el disco.  Lo mismo pasa con los datos introducidos en la base de datos. Esto es bueno porque aumenta la velocidad, pero en caso de corte de energía, los datos al estar en la memoria, se perderían.
Ahora ya tenemos nuestro servidor MongoDB corriendo y una base de datos, llamada php.

Trabajar con MongoDB desde PHP

Si nuestra versión de PHP no incluye el drive para MongoDB, como es mi caso, hay que instalarlo manualmente. Nos dirigimos a la página de descarga del driver para PHP y elegimos la versión que se corresponde a la versión de nuestro PHP, en mi caso, la versión 5.3.
Una vez descargado el fichero, nos dirigimos a la carpeta donde PHP guarda las extensiones (en mi caso, al estar usando XAMPP, está en /xampp/php/ext) y copiamos el archivo llamadophp_mongo.dll.
Después hay que incluirlo en el fichero de configuración de PHP, php.ini, para que al arrancar cargue también el driver de MongoDB. Abrimos el fichero php.ini y agregamos la siguiente línea:extension=php_mongo.dll.
Para que los cambios surjan efecto, hay que reiniciar el servidor Apache. Si al arrancar el Apache nos muestra algún error, hay que fijarse (lo pondrá en el error) en la versión de VC con la que está compilado nuestro Apache y elegir la dll (el driver de Mongo descargado anteriormente) que corresponda a la versión del VC de Apache.
Ahora vamos a empezar con el código, primero vamos a probar si el driver de MongoDB realmente funciona bien:
?
1
<!--?php $conn = new Mongo(); if ($conn) { echo "Ok"; } else { echo "Fail"; } ?-->
Si recibimos el mensaje Ok, es que todo funciona perfectamente, como véis en el ejemplo, estamos instanciando la clase Mongo, al constructor de la clase podemos pasarle varios parámetros, como la dirección del servidor, el puerto, etc. En nuestro caso, al dejarlo todo por defecto, se conectará a localhost usando el puerto por defecto de Mongo.
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!--?php $conn = new Mongo(); $db = $conn--->php; //seleccionamos la base de datos php
 
// elegimos una coleccion llamada usuarios
$coll = $db->usuarios;
 
// agregamos usuarios
$obj = array(
"user" => "madpitbull_99",
"email" => "madpitbull@mail.com",
"password" => "pass"
);
$coll->insert($obj);
 
// agregamos otro usuario
$obj = array(
"user" => "Alex",
"email" => "alex@mail.com",
"password" => "pass_de_alex"
);
$collection->insert($obj);
 
// pedimos todos los elementos de la coleccion
$res = $coll->find();
 
// iterate through the results
foreach ($res as $obj) {
echo $obj["user"] . " - " . $obj["password"] . "\n";
}
 
?>
El código no requiere muchas explicaciones, lo primero que hacemos es conectarnos al servidor (al instanciar la clase). Seleccionamos la base de datos (que hemos creado anteriormente), y la colección (es como una tabla de los motores SQL) e insertamos dos usuario que más tarde listaremos.
A partir de aquí esto depende de vosotros, más abajo os dejo la documentación necesaria para seguir practicando, al final y al cabo, al poca diferencia entre usar MySQL, PostgreSQL o cualquier otro.
Nota:
Si Apache/PHP os da problemas con la .dll (puede pasar al usar XAMPP), usad esta .dll:php_mongo-20100305-5.3-vc6-x86_good.zip.
Fuente: madhacking