Introducción a MongoDB

La necesidad de análisis de grandes cantidades de datos, así como de mantener una flexibilidad en sus estructuras, ha convertido en cada vez más común el uso de las bases de datos no relacionales (NoSQL). Un ejemplo de dicho tipo de base de datos no relacional es MongoDB, de la cual vamos a exponer una breve introducción de conceptos en este post.

A lo largo de esta publicación os vamos a contar conceptos para introduciros a MongoDB, desde los conceptos más básicos hasta como realizar ciertas operaciones básicas.

Conceptos básicos de MongoDB

La unidad básica de datos en MongoDB se denomina documento.  Su estructura es muy similar a la de *JSON* pero se almacena en un formato más rico conocido como *BSON* (Binary *JSON*). Dichos documentos se agrupan a su vez en colecciones.

MongoDB se caracteriza por:

  • Colecciones schemaless
  • Escalabilidad horizontal
  • Alta disponibilidad

A continuación indagamos en cada una de ellas:

Colecciones Schemaless

En MongoDB, los documentos de una misma colección no necesariamente comparten la misma estructura, lo que aporta una gran flexibilidad, perfecta para realizar prototipados o proyectos donde los modelos de datos pueden variar iterativamente. En el siguiente ejemplo, vemos dos documentos con diferente estructura que forman parte de una misma colección ‘jumpers’:

{                                  {
    color : "red",                    color : "blue",

    material : "wool",                material : "cotton",

    price : 20                        sport : true
}                                  }   

Escalabilidad horizontal

MongoDB permite escalar horizontalmente de forma sencilla mediante un sistema de sharding. Esto permite repartir colecciones entre distintas máquinas (shards) de forma que, dependiendo de la estrategia que sigamos en la elección de la clave de sharding, podremos optimizar lecturas o escrituras para manejar volúmenes de operaciones cada vez mayores sin perder tiempo de respuesta.

Alta disponibilidad

MongoDB permite configurar de forma sencilla sistemas de replicación en replicasets (conjuntos formados por N máquinas, una master y N-1 replicas), que garantizan que, en caso de pérdida o caída de un nodo master, una de las réplicas es automáticamente promocionada a master, manteniendo el sistema operativo.

Pero no todo son ventajas

Uno de los principales contras en MongoDB es la falta de transacciones tal y como las conocemos en las bases de datos relacionales. Sólo existen transacciones en las operaciones sobre un único documento, a muy bajo nivel. Esto es lo que se conoce como atomicidad.

Otra desventaja es la complejidad en la construcción de consultas ya que al ser una base de datos no relacional, no existe el concepto **JOIN** en las sentencias de recuperación de la información.

Operaciones básicas (CRUD – Create, Read, Update, Delete)

Son muchas las operaciones que se pueden hacer en MongoDB. Algunas de las más esenciales son insertar un nuevo documento (create), obtener un documento (read), actualizar un documento existente (update) y eliminar un documento (delete).

Os ponemos un caso. Supongamos que nuestro esquema en la base de datos se llama ‘wardrobe’, y contiene una colección ‘jumpers’ para almacenar nuestros documentos anteriores. Antes de cualquier operación en la terminal, tenemos que asegurarnos haber seleccionado el esquema en el que queremos trabajar:

use wardrobe

Cómo insertar un nuevo documento (Create)

Para insertar un nuevo documento, ejecutaremos la instrucción *insert* sobre la colección, indicando los atributos que componen el documento de la siguiente forma:

db.jumpers.insert({
    color : "red",  
    material : "wool",
    price : 20   
})

 

Esta instrucción también puede recibir un array de documentos, insertándolos a la vez:

db.jumpers.insert([{
    color : "red",  
    material : "wool",
    price : 20        
},
{
    color : "blue", 
    material : "cotton",
    sport : true        
}])

A partir de la versión 3.2, existen las instrucciones por separado para añadir documentos o bien un único registro (insertOne), o de forma múltiple recibiendo un array (insertMany).

Cómo obtener un documento (Read)

Para buscar documentos utilizamos la operación ‘find’ combinándola con una serie de operadores que permiten configurar el filtro de búsqueda. En el siguiente ejemplo, buscamos los jerseys de precio mayor que 10 (operador *$gt*):

db.jumpers.find( { price: { $gt : 10 } } )

Si además quisiéramos ordenarlos por precio de forma ascendente, aplicaríamos un criterio al conjunto ya filtrado mediante la operación *sort*:

db.jumpers.find( { price: { $gt : 10 } } ).sort( { price : 1 } )

En este [enlace](https://docs.mongodb.com/v3.4/reference/operator/query/) se encuentra el listado completo de los operadores que podemos usar.

MongoDB

Cómo actualizar un documento existente (Update)

Para actualizar un documento, ejecutaremos la instrucción ‘update’ sobre la colección, configurando primero el filtro a aplicar sobre el conjunto total de datos y posteriormente los atributos a editar.

db.jumpers.update({ color : "red" }, { $set : { price : 25 } } )

Esta instrucción actualiza el primer documento que encuentra que cumpla la condición. Si quisiéramos modificar todos los documentos que cumplieran dicha condición, habría que indicarlo con el flag multi:

db.jumpers.update({ color : "red" }, { $set : { price : 25 } }, { multi : true } )

Es importante remarcar que si queremos editar sólo algunos campos de un documento, lo debemos indicar mediante el operador $set, ya que si lo obviamos, estaremos reemplazando un documento por otro:

/* La estructura del documento quedaría { color : "red", material : "wool", price : 25 } */
db.jumpers.update({ color : "red" }, { $set : { price : 25 } } )

/* La estructura del documento quedaría { price : 25 } */
db.jumpers.update({ color : "red" }, { price : 25 } )

A partir de la versión 3.2 existen instrucciones por separado para actualizar un documento (updateOne) o de forma múltiple (updateMany).

Cómo eliminar un documento (Delete)

Para eliminar un conjunto de documentos de una colección, ejecutaremos la instrucción ‘remove’ indicando el filtro que deben cumplir todos aquellos documentos que queramos eliminar:

db.jumpers.remove({ color : "blue" })

Al contrario de las operaciones anteriores, en las cuales por defecto sólo se actúa sobre el primer documento que cumpla la condición, en el caso de ‘remove’ se eliminarán todos los documentos que la cumplan. Si quisiéramos eliminar sólo un documento, deberíamos indicarlo mediante el flag justOne:

db.jumpers.remove({ color : "blue" }, { justOne : true })

A partir de la versión 3.2, aunque la operación remove se puede seguir utilizando, existen otras dos instrucciones para eliminar un sólo documento (deleteOne) o eliminar de forma múltiple (deleteMany).

En definitiva, MongoDB es una base de datos no relacional que nos ofrece potencia, flexibilidad y un buen número de features listas para ser usadas de forma sencilla con sólo instalarlo. Sin embargo, la elección de un tipo de base de datos u otra siempre dependerá en última instancia de las necesidades y características de nuestro caso de uso. ¡Hasta la semana que viene!

Deja un comentario