Acabamos de ver las operaciones básicas que podemos hacer con PHP y MongoDB. Ahí vimos cómo hacer un CRUD, pero no lo aplicamos. Es por eso que decidí hacer un ejemplo con una agenda que simplemente guarda contactos.

Dicho ejemplo de MongoDB y PHP está hecho con Bootstrap y puedes clonarlo o descargarlo en el repositorio de GitHub.
Requisitos y recomendaciones
Únicamente lee el post anterior, pues aquí partiré con la idea de que ya sabes cómo hacer las operaciones básicas.
¿Por qué no hay ejemplo en línea?
Intenté pero al final decidí no perder más tiempo, y por ahora la única manera de probarlo es descargarlo por ti mismo. Recuerda seguir los tutoriales del post anterior para habilitar la extensión y todas esas cosas.
El paradigma
Intenté abstraer todo en un paradigma de tipo MVC. No se usa ningún framework, es PHP puro. Para la gestión de paquetes utilizo composer, y un tema de Bootstrap.
El modelo
Es un modelo que se encarga de interactuar con la base de datos y las operaciones de la agenda. Se ve así:
<?php
class ContactosModel
{
private static 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);
}
/**
* @param $contacto Contacto: un objeto de la clase Contacto
* @return bool indicando si la inserción fue correcta
*/
public static function insertar($contacto)
{
$baseDeDatos = self::obtenerBaseDeDatos();
# Acceder a la colección contactos
$coleccion = $baseDeDatos->contactos;
$resultado = $coleccion->insertOne([
"nombre" => $contacto->getNombre(),
"direccion" => $contacto->getDireccion(),
"correoElectronico" => $contacto->getCorreoElectronico(),
]);
return $resultado->getInsertedCount() === 1;
}
public static function obtenerPorId($id)
{
$baseDeDatos = self::obtenerBaseDeDatos();
$coleccion = $baseDeDatos->contactos;
return $coleccion->findOne(["_id" => new MongoDB\BSON\ObjectId($id)]);
}
public static function obtenerTodos()
{
$baseDeDatos = self::obtenerBaseDeDatos();
$coleccion = $baseDeDatos->contactos;
return $coleccion->find(); // Sin criterio de búsqueda
}
public static function actualizar($id, $contacto)
{
echo "id => $id";
$baseDeDatos = self::obtenerBaseDeDatos();
$coleccion = $baseDeDatos->contactos;
$resultado = $coleccion->updateOne(
// El criterio, algo así como where
["_id" => new MongoDB\BSON\ObjectId($id)],
// Nuevos valores
[
'$set' => [
"nombre" => $contacto->getNombre(),
"direccion" => $contacto->getDireccion(),
"correoElectronico" => $contacto->getCorreoElectronico(),
],
]
);
# Recuerda que puedes ver a cuántos afectó con $resultado->getModifiedCount()
return true;
}
public static function eliminar($id)
{
$baseDeDatos = self::obtenerBaseDeDatos();
$coleccion = $baseDeDatos->contactos;
$resultado = $coleccion->deleteOne(
// El criterio, algo así como where
["_id" => new MongoDB\BSON\ObjectId($id)]
);
return $resultado->getDeletedCount() === 1;
}
}
Nota: tal vez con el paso del tiempo ya actualicé el código, pero no te preocupes, el archivo actualizado siempre estará en el repositorio de GitHub.
El controlador
Un simple pegamento. Evalúa la url y dependiendo de ello incluye las vistas. También se encarga de definir variables que son “pasadas” a las vistas, gracias al modelo.
Todo eso está en el index.
Las vistas
Simples archivos de PHP que renderizan y proveen una interfaz gráfica. Están separadas por la acción que hacen, y la mayoría de veces son incluidas con el encabezado y pie.
La seguridad
No he validado nada, es un simple ejercicio. Me parece que la seguridad es la cosa más importante en los sistemas, pero no lo he puesto por simplicidad.
Una clase
Para simplificar cosas, hice una clase que permitirá que las funciones queden más cortas (como cuando conectamos MySQL con Go).