Hoy veremos un tutorial sobre cómo trabajar con PHP y el motor de base de datos MongoDB. Haremos un CRUD que nos permitirá crear, leer, actualizar y eliminar documentos de MongoDB utilizando el lenguaje de programación PHP.
Existe una librería que provee mongodb, la cual funciona de maravilla para trabajar con MongoDB y PHP. Veamos algunos ejemplos de uso.
Como segunda parte del tutorial, veremos un ejemplo práctico que podrás probar en vivo, ya que aquí veremos únicamente cómo son las operaciones administrativas (CRUD o ABC) para no complicar el post.
Requisitos y recomendaciones
- Instala PHP, te recomiendo que lo hagas con XAMPP
- Habilita e instala la extensión de MongoDB, este paso es muy importante
- Luego de eso, instala y configura Composer (no seas perezoso ni dejado, si hoy en día quieres desarrollar con PHP necesitas composer sí o sí)
- También instala y configura MongoDB
- Seguramente vas a querer crear usuarios para administrar Z
- Finalmente, si quieres el equivalente a PhpMyAdmin instala Robomongo
Con eso tenemos por el momento.
Configurar proyecto
Una vez que tengas instalado composer, navega en la terminal hasta la carpeta de tu proyecto y ejecuta:
composer require mongodb/mongodb
Eso instalará la dependencia en caso de que tengas un proyecto con composer, si no, creará un nuevo archivo de configuración y añadirá a la misma.
Ahí está la captura de que se ha descargado e instalado la librería. Ahora, en tu archivo index.php (o en donde vayas a usar la librería) importa el autoload (repito, esto en caso de que no tengas anteriormente un proyecto con composer):
require_once __DIR__ . "/vendor/autoload.php";
Con esto ya podemos comenzar a trabajar.
La base de datos y la cadena de conexión
La documentación oficial es extensa, y cubre casos específicos (cosa muy buena), sin embargo, si quieres mi recomendación y mi forma de obtener una instancia para trabajar con PHP y MongoDB utiliza este código:
<?php
function obtenerBaseDeDatos()
{
$host = "127.0.0.1";
$puerto = "27017";
$usuario = rawurlencode("parzibyte");
$pass = rawurlencode("hunter2");
$nombreBD = "agenda";
# Crea algo como mongodb://parzibyte:hunter2@127.0.0.1:27017/agenda
$cadenaConexion = sprintf("mongodb://%s:%s@%s:%s/%s", $usuario, $pass, $host, $puerto, $nombreBD);
$cliente = new MongoDB\Client($cadenaConexion);
return $cliente->selectDatabase($nombreBD);
}
De esta manera puedes adaptarlo a tus necesidades, además de que puedes cambiar rápidamente las opciones como el puerto, host, usuario y contraseña.
Debido a que es una cadena de conexión (así como una URL), es una buena práctica codificar el usuario y la contraseña con rawurlencode; esto es porque no sabemos si la contraseña contendrá un carácter especial como el arroba.
El método selectDatabase
es para seleccionar una base de datos (oh, no me digas) pero sin importar el nombre de la misma; porque normalmente podríamos hacerlo con $cliente->base_de_datos
a través de los métodos mágicos, pero ¿qué pasa si queremos acceder a una base de datos cuyo nombre tiene espacios o un nombre raro? igual se puede con $cliente->{nombre complejo}
pero a mi parecer es mejor ser implícito.
Insertar datos en MongoDB
Por cierto, estoy usando la notación corta de los arreglos, mira el post por si mantienes una versión antigua de PHP. Para insertar datos en MongoDB a través de PHP usamos el método insertOne
, el cual se ejemplifica abajo:
<?php
$baseDeDatos = obtenerBaseDeDatos();
# Acceder a la colección contactos
$coleccion = $baseDeDatos->contactos;
$resultado = $coleccion->insertOne([
"un_campo" => "el nuevo valor",
"otro_campo" => "otro nuevo valor",
]);
Accedemos a una colección dentro de nuestra base de datos, y ahí llamamos al método mencionado arriba. Le pasamos un objeto con las propiedades que queramos; se guardará completo justo como lo mandemos.
Leer datos de MongoDB
Este es un método que le pertenece a las colecciones, se llama find. Podemos mandarle un criterio de búsqueda, lo equivalente al WHERE de SQL.
<?php
$baseDeDatos = obtenerBaseDeDatos();
$coleccion = $baseDeDatos->contactos;
return $coleccion->find(); // Sin criterio de búsqueda
El método regresa un cursor que podemos iterar con un foreach, así:
<?php
foreach ($cursor as $dato){
echo $dato->valor;
}
En cada iteración obtenemos el objeto de la base de datos, y ya podemos acceder a sus propieades.
Si tú no quieres un cursor, y quieres un arreglo, llama al método $cursor->toArray()
y listo. Esto sería útil cuando construimos una API con JSON y debemos imprimir los datos como un arreglo.
Igualmente existe el método findOne
, que regresa únicamente un objeto que cumpla con el criterio que le pasamos.
Actualizar datos
Usamos ahora el método updateOne
que tienen las colecciones. Recibe dos argumentos: el criterio de búsqueda y el nuevo objeto. Esto vamos a explicarlo a detalle.
Cuando usamos updateOne
y mandamos un nuevo objeto, el anterior se destruye. No importa si el anterior tenía 3 propiedades y el que mandamos tiene 1, las otras 2 propiedades serán eliminadas.
En caso de que (y la mayoría de veces es esto) queramos actualizar únicamente algunas propiedades usamos el selector $set, así sólo algunas se actualizan.
<?php
$baseDeDatos = obtenerBaseDeDatos();
$coleccion = $baseDeDatos->contactos;
$resultado = $coleccion->updateOne(
// El criterio, algo así como where
["_id" => new MongoDB\BSON\ObjectId($id)],
// Nuevos valores, no es necesario poner todos pero aquí es para ejemplificar
[
'$set' => [
"campo" => "valor actualizado",
"otro campo" => "otro valor actualizado",
],
]
);
# Recuerda que puedes ver a cuántos afectó con $resultado->getModifiedCount()
Otra cosa que tiene PHP es que si encuentra el signo de $ intentará interpretar la cadena, para evitar esto, usa comillas simples: ‘$set’ o escapa la cadena: “\$set”.
Si te fijas bien, el _id no lo pasamos directamente como cadena, sino que creamos un objeto de tipo ObjectId, abajo lo explico mejor.
El id y el ObjectId
No sé por qué, pero debe haber una razón justa y normal para tener que crear un nuevo objeto al filtrar por id. Normalmente esperaríamos algo así al indicar el criterio de updateOne
:
["_id" => $id]
Pero tenemos que convertirlo a ObjectId
así:
["_id" => new MongoDB\BSON\ObjectId($id)]
Esto es necesario siempre que nuestro filtro incluya el _id, ya sea al eliminar, obtener o actualizar.
Supongo que internamente Mongo descompone el Id, o lo procesa de mejor manera al ser un objeto, no sé pero así se hace y como lo dije antes, debe haber una buena razón que desconozco.
Eliminar datos de MongoDB desde PHP
Finalmente veamos cómo eliminar datos. Para ello tenemos el método deleteOne
que funciona muy parecido al de updateOne
, pero este únicamente toma un argumento, el cual es el selector. Normalmente lo haremos con el _id.
<?php
$baseDeDatos = obtenerBaseDeDatos();
$coleccion = $baseDeDatos->contactos;
$resultado = $coleccion->deleteOne(
// El criterio, algo así como where
["_id" => new MongoDB\BSON\ObjectId($id)]
);
$eliminados = $resultado->getDeletedCount();
Recomiendo ver lo que regresa getDeletedCount
para ver si sí eliminamos al menos uno.
Conclusión y apuntes
También existen los métodos updateMany
, insertMany
y deleteMany
para actualizar, insertar y eliminar muchos, respectivamente.
Solamente vimos los pilares básicos, pero aquí dejo de nuevo la documentación completa para que puedas investigar a fondo.
Por otro lado, con estas bases de datos importan mucho los selectores, algo así como el where
de SQL. Aunque no lo creas, existen para la mayoría de casos y aquí está la lista completa.
Pingback: CRUD (create, read, update, delete) en Python y MongoDB - Parzibyte's blog
Pingback: Ejemplo práctico con MongoDB y PHP: agenda - Parzibyte's blog