En esta lección vamos a ver cómo hacer un CRUD básico con MongoDB y PHP como lenguaje de programación. En este caso será una simple lista de contactos en la que podremos insertar, listar, editar y borrar.

Pero antes vamos a ver los diferentes métodos que tenemos en PHP para trabajar con los datos en MongoDB.
Lo primero en cualquier operación sera instanciar el Driver para realizar la conexión con MongoDB.
|
1 |
Objeto->conexion = new MongoDB\Driver\Manager("mongodb://localhost:27017"); |
Con esta ejecución tenemos activa una conexión con MongoDB (recuerda tener Mongodb activo en tu sistema).
Para realizar el envio de datos (insertar, actualizar, borrar) utilizaremos la librería del Driver llamada BulkWrite, la cual nos prepara un objeto para realizar la transacción que queramos realizar.
|
1 |
$bulk = new MongoDB\Driver\BulkWrite; |
Una vez tenemos el objeto BulkWrite definimos procederemos a preparar la inserción:
|
1 |
$bulk->insert(['nombre' => $contacto["nombre"], 'telefono' => $contacto["telefono"], 'mail' => $contacto["mail"], 'comentarios' => $contacto["comentarios"]]); |
Es importante ver como le estamos mandando los datos con formato de Array asociativo de PHP, lo que facilita mucho el trabajo, dado que casi todas las estructuras de datos utilizadas como el $_POST, $_GET, $_SESSION… tienen esa estructura.
El siguiente paso ya es realizar la transacción utilizando el método «executeBulkWrite» del objeto que generamos en primer lugar.
|
1 |
$objeto->connection->executeBulkWrite("Agenda.Contactos", $bulk); |
Cómo podemos observar en la ejecución enviamos como paramentros, la construcción del insert ($bulk) y la colección en la que queremos insertar el dato.
NOTA: En este ejemplo en ningún momento hemos creado la colección en MongoDB, esta se creara al realizar la primera inserción.
¿Fácil verdad?
Veamos cómo quedaría el proceso de conexión y el de insertar en una clase DAO para nuestra aplicación.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
lass ContactosDAO { private $connection; /** * ContactosDAO constructor. */ public function __construct(){ $this->connection= new MongoDB\Driver\Manager("mongodb://localhost:27017"); } /** * @param $contacto */ public function insertarContacto($contacto){ $bulk = new MongoDB\Driver\BulkWrite; $bulk->insert(['nombre' => $contacto["nombre"], 'telefono' => $contacto["telefono"], 'mail' => $contacto["mail"], 'comentarios' => $contacto["comentarios"]]); $this->connection->executeBulkWrite("Agenda.Contactos", $bulk); } |
En el constructor de la clase hemos puesto el proceso de instanciación del Driver que nos conectará directamente cada vez que creemos un objeto de esta DAO. En este caso hemos puesto un atributo «$connection» para mantener la conexión abierta mientras usemos el objeto.
Si lo preferimos también podríamos utilizar el método de forma estática de esta forma lo que evitaría instanciar el objeto cada vez.
|
1 2 3 4 5 6 |
public static function insertarContacto($contacto){ $connection= new MongoDB\Driver\Manager("mongodb://localhost:27017"); $bulk = new MongoDB\Driver\BulkWrite; $bulk->insert(['nombre' => $contacto["nombre"], 'telefono' => $contacto["telefono"], 'mail' => $contacto["mail"], 'comentarios' => $contacto["comentarios"]]); $connection->executeBulkWrite("Agenda.Contactos", $bulk); } |
La llamada desde fuera de la clase para realizar la inserción seria:
|
1 |
ContactoDAO::insertarContacto($contacto); |
Update
Los métodos de actualizar y borrar son muy similares al anterior, solo que esta vez tendremos que indicarle el _id del elemento a modificar.
|
1 2 3 4 5 6 7 8 |
public function actualizarContacto($contacto){ $bulk = new MongoDB\Driver\BulkWrite; $filter = ['_id' => new MongoDB\BSON\ObjectId($contacto["id"])]; $collation = ['$set' => ['nombre' => $contacto["nombre"], 'telefono' => $contacto["telefono"], 'mail' => $contacto["mail"], 'comentarios' => $contacto["comentarios"]]]; $bulk->update($filter, $collation); $this->connection->executeBulkWrite('Agenda.Contactos', $bulk); } } |
Al igual que antes vemos como creamos un objeto «BilkWrite» y como en las tres últimas lineas llamamos en este caso al método update enviado los datos como un array asociativo y realizamos la transacción con «executeBulkWrite» indicando la colección y la sentencia.
La diferencia es que en este caso tenemos que poner un filtro ($filter), donde indicamos el id del documento de MongoDB.
|
1 |
$filter = ['_id' => new MongoDB\BSON\ObjectId($contacto["id"])]; |
Al llamar al método update enviamos el filtro y los datos.
|
1 |
$bulk->update($filter, $collation); |
Delete
Para el borrado de un documento igualmente tenemos que realizar un filtro, pero en este caso Mongo ya dispone de un método ObjectId para enviarle el identificador del documento.
|
1 |
$filter = ['_id' => new MongoDB\BSON\ObjectId($id)]; |
En la llamada al método delete incluiremos un filtro enviando el id y el limite que indica que debe hacer con los coincidentes encotrados.
|
1 |
$bulk->delete($filter, ['limit' => 0]); |
Limit: Indicador booleano que selecciona si queremos eliminar todos los documentos coincidentes (límite = 0) TRUE, o solo el primer documento encontrado (límite = 1) FALSE.
El método completo sería:
|
1 2 3 4 5 6 |
public function eliminarContacto($id){ $bulk = new MongoDB\Driver\BulkWrite; $filter = ['_id' => new MongoDB\BSON\ObjectId($id)]; $bulk->delete($filter, ['limit' => 0]); $this->connection->executeBulkWrite('Agenda.Contactos', $bulk); } |
Obtención de datos
La obtención de datos en Mongo con PHP es igualmente sencilla, aunque utilizaremos diferentes librerías o clases que el caso del envio.
|
1 2 3 4 5 |
public function getContactos(){ $filter = []; $query = new MongoDB\Driver\Query($filter); return $this->connection->executeQuery("Agenda.Contactos", $query); } |
En este caso observamos como solo tenemos que llamar al método Query del Driver.
|
1 |
$query = new MongoDB\Driver\Query($filter); |
Si dejamos el filtro vacío nos devolverá todos los documentos de la colección.
|
1 |
$filter = []; |
En último lugar vemos como el método para realizar la transacción de los datos es executeQuery(«Agenda.Contactos», $query);
Veamos ahora la clase DAO completa.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
<?php /** * Class ContactosDAO */ class ContactosDAO { private $connection; /** * ContactosDAO constructor. */ public function __construct(){ $this->connection= new MongoDB\Driver\Manager("mongodb://localhost:27017"); } /** * @param $contacto */ public static function insertarContacto($contacto){ $connection= new MongoDB\Driver\Manager("mongodb://localhost:27017"); $bulk = new MongoDB\Driver\BulkWrite; $bulk->insert(['nombre' => $contacto["nombre"], 'telefono' => $contacto["telefono"], 'mail' => $contacto["mail"], 'comentarios' => $contacto["comentarios"]]); $connection->executeBulkWrite("Agenda.Contactos", $bulk); } /** * @param $id */ public function eliminarContacto($id){ $bulk = new MongoDB\Driver\BulkWrite; $filter = ['_id' => new MongoDB\BSON\ObjectId($id)]; $bulk->delete($filter, ['limit' => 0]); $this->connection->executeBulkWrite('Agenda.Contactos', $bulk); } /** * @return \MongoDB\Driver\Cursor * @throws \MongoDB\Driver\Exception\Exception */ public function getContactos(){ $filter = []; $query = new MongoDB\Driver\Query($filter); return $this->connection->executeQuery("Agenda.Contactos", $query); } /** * @param $contacto */ public function actualizarContacto($contacto){ $bulk = new MongoDB\Driver\BulkWrite; $filter = ['_id' => new MongoDB\BSON\ObjectId($contacto["id"])]; $collation = ['$set' => ['nombre' => $contacto["nombre"], 'telefono' => $contacto["telefono"], 'mail' => $contacto["mail"], 'comentarios' => $contacto["comentarios"]]]; $bulk->update($filter, $collation); $this->connection->executeBulkWrite('Agenda.Contactos', $bulk); } } |
Ahora ya solo nos quedaría confeccionar nuestra aplicación dandole funcionalidad con listados y formularios en HTML.