MongoDB nos ofrece gran cantidad de clientes para interactuar con él mediante gran cantidad de lenguajes de programación (Drivers MongoDB).
En nuestro ejemplo interactuaremos con MongoDB mediante la Librería PHP para MongoDB.
Siguiendo la Información de instalación de la Librería PHP para MongoDB podrás instalar estos dos componentes necesarios:
mongodb
para PHP en tu equipo a través del repositorio de extensiones PHP PECL.Aquí mostraremos los pasos de instalación en un Ubuntu Linux que ya tiene instalado previamente MongoDB y un entorno LAMP (Tutorial sobre configuración de un entorno LAMP+NoSQL). Básicamente se trata de descargar e instalar el driver, añadir la extensión al php.ini
, y reiniciar el servidor Apache.
Si no tienes instalado PEAR
y el paquete php-dev
deberás instalarlos con
sudo apt-get install -y php-pear
sudo apt-get install -y php-dev
Para descargar e instalar el driver lo haremos con
sudo pecl install mongodb
Esto hará que se descargue el driver, se compile y se instale en nuestro sistema como una extensión.
Si estuviésemos utilizando XAMPP, tendríamos que utilzar el pecl
de XAMPP. Por ejemplo, podríamos hacerlo de una forma similiar a esta:
sudo /Applications/XAMPP/xamppfiles/bin/pecl install mongodb
A continuación hay que modificar el archivo php.ini
para indicar que cargue la extensión de MongoDB (mongodb.so
). php.ini
se encuentra en /etc/php/7.0/apache2/php.ini
. Tendrás que añadir lo siguiente en la zona de extensiones.
extension=mongodb.so
Ahora, reiniciaremos el servidor Apache para que tengan efecto los cambios
sudo service apache2 restart
En este Tutorial sencillo de PHP con MongoDB puedes encontrar un ejemplo guiado de cómo comenzar con los aspectos básicos del scripting PHP con MongoDB. Además, es muy conveniente tener a mano esta [Referencia] (https://docs.mongodb.com/php-library/master/reference/) en la que podrás encontrar casi todo lo que necesitas para tu aplicación PHP con MongoDB.
La Librería PHP para MongoDB ofrece una abstracción de alto nivel sobre el driver PHP para MongoDB.
Instalaremos la Librería PHP para MongoDB mediante Composer
ejecutando el comando siguiente sobre la raíz de nuestro proyecto
composer require mongodb/mongodb
Esto instalará la librería en nuestro proyecto y generará los archivos de autoload
.
Si se produce un error de este tipo
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Installation request for mongodb/mongodb ^1.6 -> satisfiable by mongodb/mongodb[1.6.0].
- mongodb/mongodb 1.6.0 requires ext-mongodb ^1.7 -> the requested PHP extension mongodb is missing from your system.
To enable extensions, verify that they are enabled in your .ini files:
- /etc/php/7.0/cli/php.ini
...
nos está informando que no puede encontrar la extensión de MongoDB para PHP. Esto se debe a que Composer no está usando el mismo archivo php.ini
que hemos configurado anteiormente. Una opción es añadir al archivo /etc/php/7.0/cli/php.ini
la extensión de MongoDB para PHP:
extension=mongodb.so
Para usar la librería en el proyecto comenzaremos con el script siguiente
<?php
require 'vendor/autoload.php';
?>
Una vez instalada la librería, el proceso de conexión es muy sencillo. Basta con instanciar la clase MongoDB\Client
. Si no indicamos parámetros se conectará usando localhost
y el puerto predeterminado (27017
).
Esta clase sirve como punto de entrada a la MongoDB PHP Library. Usaremos la clase \MongoDB\Client
para conectarnos a un servidor o cluster de servidores MongoDB y actúa como gateway para acceder a bases de datos o colecciones.
La conexión creada nos servirá para seleccionar la base de datos y la colección con la que queremos trabajar. Podremos crear un objeto para la base de datos y otro para la colección, o bien crear sólo el objeto de la colección si no queremos usar ninguno de los métodos aplicables a la base de datos (crear bases de datos, operaciones con el profile, write concern, …)
A continuación vemos cómo crear un objeto para una base de datos de ejemplo denominada ggvdTest
y un objeto para una colección de prueba denominada actor
, que incluirá actores.
Los documentos se crean mediante arrays asociativos. Estos documentos se insertarán con los métodos insertOne()
o insertMany()
sobre la colección correspondiente, para insertar uno o varios documentos, respectivamente.
NOTA
A los métodos de inserción, actualización y eliminación le podremos pasar opcionalmente un array de opciones (p.e. para especificar el
Write Concern
).
Los documentos se actualizan mediante los métodos updateOne()
o updateMany()
sobre una colección. A los métodos le pasaremos el array asociativo con los criterios, el nuevo objeto (que podrá incluir operadores de actualización para modificar o reemplazar documentos), y de forma optativa las opciones de actualización.
Entre las opciones de actualización más destacadas se encuentran upsert
(boolean
), que especifica si crear un documento nuevo o no si no hay ninguna coincidencia en la búsqueda, y writeConcern
.
En el caso de que usemos el método updateOne()
y existan varios documentos que cumplan los criterios, sólo se actualizará el primer documento que cumpla los criterios.
La eliminación de documentos se realiza mediante los métodos deleteOne()
o deleteMany()
aplicados a una colección. A los métodos le pasaremos el array asociativo con los criterios, y de forma optativa las opciones de eliminación.
Al igual que con el método updateOne()
, en el caso de que usemos el método deleteOne()
y existan varios documentos a que cumplan los criterios, sólo se eliminará el primer documento que cumpla los criterios.
La búsqueda de documentos se realiza básicamente mediante los métodos findOne()
y find()
aplicados a una colección para buscar, respectivamente, uno o varios documentos que cumplan los criterios de búsqueda. En el caso de usar find()
, recorreremos el resultado con un bucle foreach
y en cada pasada cada documento será tratado como un array asociativo.
Las operaciones relacionadas con el framework de agregación se realizan con el método aggregate()
. A este método le proporcionaremos el pipeline de operaciones ($match
, $project
, $group
, $sort
, …) en forma de array asociativo. El método devolverá el resultado en forma de array tal y como ocurre como cuando se usa el framework de agregación desde la shell.
Puedes descargar el código de este tutorial del GitHub de este proyecto.