Mongo DB

Conectar PHP con MongoDB: CRUD

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

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.

Instalar librería de MongoDB en PHP

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.