MongoDB 101: CRUD operations

Ninety percent of everything is crud.

 Theodore Sturgeon

A pesar de que Theodore Sturgeon no se refería a los procedimientos de Create Read Update y Delete (Crear, Leer, Actualizar y Eliminar) que hacemos sobre bases de datos comúnmente en el comentario anterior. Ciertamente también tiene sentido si lo utilizamos en el contexto de las bases de datos. A excepción de operaciones de diseño, respaldo, entre otras, casi todo lo que usualmente hacemos con una base de datos tiene que ver con operaciones CRUD, y MongoDB no es la excepción.

 

En el post anterior vimos como instalar MongoDB en nuestra computadora y además a  crear bases de datos y colecciones. Es hora de empezar a hacer operaciones sobre los documentos que almacenaremos en las colecciones.

 

MongoDB insert –  Crear/Insertar:

Para crear documentos y añadirlos a colecciones, MongoDB nos provee 2 comandos:

-InsertOne():

Este comando nos permite insertar un documento en la colección sobre la cual llamemos el método. Por ejemplo, supongamos que queremos insertar un estudiante en nuestra colección de estudiantes. Lo podríamos hacer de la siguiente manera:

 

“db.estudiantes.insertOne({

          nombre: ‘Juan’,

          apellido: ‘Linarez’,

          edad: 21,

          notas: [18,19,16],

          programa: { 

                nombre: ‘Ingeniería en Informática’,

                nivel: ‘pregrado’

                }

})”

 

MongoDB nos mostrará el siguiente mensaje indicando que se insertó el documento en la colección.

De igual forma podemos comprobarlo utilizando el siguiente comando.

 

“db.estudiantes.find()”

 

Este es el método de consulta más básico, más adelante veremos más sobre estos.

 

Como podemos ver, MongoDB asignó un id automático al documento si no se lo proveemos nosotros en el comando de insertOne(). En este caso genero el id «5955c3502402c97f02755f3d».

 

Además, vemos que podemos insertar cualquier tipo de dato en un documento:

  • nombre y apellido son strings.
  • edad es un número entero
  • notas es un arreglo de valores enteros
  • programa es un objeto JSON

 

– InsertMany():

Este comando como su nombre lo dice nos permite insertar varios documentos a la vez, por lo que podemos pasar varios objetos, similares al utilizado el comando anterior, en un arreglo y separados por comas (,). El siguiente ejemplo nos permite insertar otros 3 estudiantes utilizando un solo insertar:

 

“db.estudiantes.insertMany(

{[

           nombre: ‘Carlos’,

           apellido: ‘Sanchez’,

           edad: 22,

           notas: [16,14,18],

           programa: {

                  nombre: ‘Ingeniería en Informática’,

                  nivel: ‘pregrado’

                  }

},

{

           nombre: ‘Maria,

           apellido: ‘Alvarado’,

           edad: 25,

           notas: [18,19,20],

           programa: {

                  nombre: ‘Mención Ingeniería de Sofware’,

                  nivel: ‘postgrado’

                  }

},

{

           nombre: ‘Osvaldo’,

           apellido: ‘Sotomonte’,

           edad: 20,

           notas: [16,10,14],

           programa: {

                   nombre: ‘Ingeniería en Informática’,

                   nivel: ‘pregrado’

                   }

}

])”

 

El cual muestra el siguiente mensaje, confirmando que se agregaron los documentos a la base de datos.

 

MongoDB find – Leer:

Para obtener los documentos almacenados en una colección, utilizamos el método find().

Si queremos obtener todos los documentos de una colección pasamos un objeto vacío como parámetro al método. De la siguiente forma obtendríamos todos los estudiantes registrados:

 

“db.estudiantes.find({})”

 

Como parámetro al método find podemos pasar un objeto con los filtros de búsqueda que vamos a aplicar, cada filtro está compuesto por una dupla campo:valor en la que el campo corresponde al atributo sobre la cual se aplicará el filtro con el valor especificado. Por ejemplo, si quisiéramos retornar todos los estudiantes que se llamen “Juan”, haríamos la siguiente consulta:

 

“db.estudiantes.find({nombre : ‘Juan’})”

 

De esta forma hacemos búsquedas en las que el criterio de búsqueda es la igualdad del campo con el valor. Pero, y si queremos hacer búsquedas utilizando criterios de desigualdad, o mayor y menor, o conjunción y disyunción?

 

Esto lo podemos conseguir utilizando operadores de consulta, para lo cual en vez de pasar una dupla campo:valor, sustituimos el valor con un objeto formado por otra upla operador:valor, por lo que el objeto completo estaría estructurado de la forma { campo : { operador : valor} }.

 

Por ejemplo, si quisiéramos buscar todos los estudiantes mayores a 23 años, utilizaríamos la siguiente consulta:

 

“db.estudiantes.find({ edad : { $gt : 23 } })”

 

Aquí, el operador utilizado es $gt, que representa el mayor que (greater than).

 

Una lista completa de los operadores que podemos utilizar se encuentra en el siguiente enlace:

 

Operadores a utilizar en mongodb find

 

Para hacer búsquedas con disyunción o “and lógico” basta con pasar en el objeto de filtro, los diferentes campos sobre los que se hará una búsqueda separados por coma. Por ejemplo, si queremos encontrar los estudiantes de nombre “María” y mayores a 22 años lo haríamos de la siguiente manera:

 

“db.estudiantes.find( { edad : { $gt : 22 }, nombre : ‘Maria’ } )”

 

Y por el contrario para hacer búsquedas con conjunción u “o lógico” se usa el operador $or, pasándole como valor un arreglo con las condiciones sobre las cuales se quiere buscar. Por ejemplo, si quisiéramos encontrar los estudiantes que tuvieran de nombre “Juan” o que tengan más de 24 años, lo haríamos de la siguiente forma:

 

“db.estudiantes.find( { $or : [ { nombre : ‘Juan’ }, { edad : { $gt : 24 } } ] } )”

 

Existen muchas más cosas que podemos agregar a nuestros criterios de búsqueda, y las veremos en el próximo post. Ya que por ahora nos enfocaremos en búsquedas básicas y las otras operaciones del crud.

 

MongoDB update – Actualizar:

Para modificar documentos existentes, podemos utilizar 3 métodos: updateOne(), updateMany() y replaceOne().
 

Al igual que en los insert, la única diferencia entre updateOne y updateMany es que en el primero solo se actualizará el primer documento conseguido y en el segundo se actualizarán todos los obtenidos.

 

Los parámetros para ambas operaciones son los mismos:

  • Un filtro, que es una consulta en la cual se buscarán los elementos a ser modificados. Esta consulta tiene la misma forma que un criterio de búsqueda utilizado en un find visto anteriormente.
  • Un objeto con las modificaciones a realizar. Los operadores disponibles para este parámetro se pueden ver en el siguiente link: Operadores a utilizar en mongodb update . 3 de los más utilizados son: $set, $unset o $rename, los cuales asignan valores al campo, remueven el campo o renombran el campo respectivamente.
  • Un tercer parámetro que puede ser un objeto en el que pasemos un atributo booleano llamado upsert, el cual si no se encuentra ningún documento que cumpla con el filtro, creará un nuevo documento con las especificaciones que se fueran a modificar.

 

Por ejemplo, si quisiéramos modificar solo el primer elemento que fuera menor a 22 años y a este documento le quisiéramos agregar un campo “apodo”. Lo haríamos de la siguiente manera:

 

“db.estudiantes.updateOne( {edad : { $lt : 22 } }, { $set : { apodo : ‘el elegido’} } )”

 

En el mensaje que nos muestra además podemos ver cuantos documentos cumplieron con el criterio y cuantos fueron modificados, matchedCount y modifiedCount respectivamente.

 

Y como podemos ver si hacemos una consulta general, solo le agrego el campo nuevo al primer elemento que cumplio el criterio al haber utilizado el updateOne.

 

Ahora, si queremos remover el campo “programa” a todos los estudiantes mayores a 24 años, lo haríamos de la siguiente forma:

 

“db.estudiantes.updateMany( {edad : { $gt : 24 } }, { $unset : { programa : »} } )”

 

Y si consultamos nuevamente podemos verificar que solo se quitó el campo programa de los estudiantes que cumplían con la condición.

 

Y por último está el replaceOne(), el cual reemplaza completamente el primer documento que concuerde con el criterio con otro documento que se pasa como segundo parámetro. Al igual que con los update, se puede agregar como parámetro el upsert para hacer que si no consigue ningún elemento que cumpla con el criterio, lo inserte como documento nuevo.

 

En el siguiente ejemplo, se reemplazará el primer estudiante que tenga apellido “Linarez” por un estudiante de nombre “William” y apellido “Smith” y sin más ningún otro campo.

 

Primero consultamos para verificar los datos luego.

 

Procedemos a ejecutar el siguiente comando:

 

“db.estudiantes.replaceOne({ apellido : ‘Linarez’ }, { nombre : ‘William’, apellido : ‘Smith’ } )”

 

Y procedemos a verificar el resultado de la operación.

 

MongoDB delete – Eliminar:

Finalmente, el último de las operaciones crud, el eliminar.
 

Al igual que insert y update, posee métodos para eliminar un elemento y múltiples: deleteOne y deleteMany. Y ambos métodos solo reciben un parámetro: el filtro para seleccionar los documentos a eliminar.

 

El el siguiente ejemplo primero vamos a eliminar al primer documento con nombre “Carlos” y luego eliminaremos a todos los estudiantes de 20 años:

 

Primero consultamos los estudiantes registrados.

 

Eliminamos al primer “Carlos” usando el siguiente comando:

 

“db.estudiantes.deleteOne( { nombre : ‘Carlos’ } )”

 

Podemos ver que el resultado nos muestra el número de documentos eliminados en deletedCount.

 

Verificamos la eliminación.

 

Procedemos a eliminar a los estudiantes de 20 años con el siguiente comando:

 

“db.estudiantes.deleteMany( { edad : 20 } )”

 

Y verificamos por última vez.

 

De esta forma ya podemos realizar operaciones crud a una base de datos en MongoDB. Ahora es tu turno de  practicar y ganar experiencia con estas operaciones básicas antes de pasar a operaciones algo más avanzadas las cuales trataremos en el siguiente post.

 

Si tienes alguna duda o pregunta o te gustaría saber más sobre alguna de las operaciones en específico comenta y responderé en lo posible.

 

Publicado el 17 de noviembre de 2018