Bases de Datos NoSQL: Conceptos, Tipos y Gestión con MongoDB

¿Qué son las Bases de Datos NoSQL?

Son bases de datos que no utilizan el modelo tradicional de tablas relacionales, sino que almacenan la información de forma más flexible. También se conocen como bases de datos NoSQL (Not Only SQL).


Características Clave de las Bases de Datos NoSQL

  • No utilizan tablas ni SQL estándar.
  • Son más flexibles: no requieren una estructura fija (esquema).
  • Ofrecen escalabilidad horizontal (crecen fácilmente añadiendo más servidores).
  • Proporcionan alto rendimiento con grandes volúmenes de datos.

Tipos Comunes de Bases de Datos NoSQL

  • Clave-Valor: Ejemplos como Redis, Riak.
  • Documentales: Ejemplos como MongoDB, CouchDB.
  • Orientadas a Columnas: Ejemplos como Cassandra, HBase.
  • De Grafos: Ejemplos como Neo4j, ArangoDB.

¿Cuándo Utilizar Bases de Datos NoSQL?

  • Cuando se necesita velocidad y escalabilidad extremas.
  • Cuando los datos no tienen una estructura fija o esta cambia frecuentemente.
  • Son ideales para aplicaciones web, móviles, redes sociales, e IoT (Internet de las Cosas).

Base de Datos Clave-Valor

Utilizan una clave única para acceder rápidamente a un valor asociado.

Ejemplo:

  • usuario:1023 → ‘español’
  • usuario:2047 → ‘inglés’
  • Muy útiles para acceder de forma directa y rápida a un dato conocido.
  • Ideales para sesiones de usuario, configuración o caché.
  • No son adecuadas para búsquedas complejas o relaciones entre datos.

Casos de Uso Reales: Bases de Datos Clave-Valor

Gestión de Sesiones de Usuario y Caché

  • Amazon utiliza DynamoDB para la gestión de sesiones.
  • Redis es comúnmente empleado para tokens, caché y configuraciones temporales.


Base de Datos Documental

Almacenan la información en documentos estructurados (por ejemplo, JSON o BSON).

Ejemplo:

{ 'id': 123, 'producto': 'Camiseta', 'precio': 19.99, 'tallas': ['S', 'M', 'L'], 'stock': 120 }
  • Cada documento puede tener campos distintos, ofreciendo gran flexibilidad.
  • Ideales cuando los datos cambian de estructura o son complejos.
  • Son escalables y flexibles para objetos complejos.

Casos de Uso Reales: Bases de Datos Documentales

Catálogos de Productos y Perfiles de Usuario

  • eBay utiliza MongoDB para gestionar artículos con estructuras variables.
  • Netflix emplea bases de datos documentales para perfiles de usuario y configuraciones.

Bases de Datos Orientadas a Columnas

Almacenan datos por columnas en lugar de filas, lo que las optimiza para el análisis de grandes volúmenes de información. Ofrecen una compresión eficiente por tipo de columna, aunque son menos eficaces para escrituras frecuentes o registros pequeños.

  • Usos: Análisis de datos, Big Data, almacenes de datos (Data Warehouses).
  • Ejemplos: Cassandra, HBase, Amazon Redshift.

Ejemplo de Estructura Columnar:

ID: [1, 2, 3, 4]
Nombre: [Laura, Pedro, Ana, Luis]
Edad: [28, 34, 45, 30]
Región: [Madrid, Valencia, Madrid, Sevilla]

Para calcular la media de edad, por ejemplo, solo es necesario acceder a la columna Edad, lo que optimiza el rendimiento.


Casos de Uso Reales: Bases de Datos Orientadas a Columnas

Análisis de Comportamiento de Usuarios y Big Data

  • Facebook utiliza Cassandra para métricas de usuario.
  • Uber y Spotify emplean Amazon Redshift o Google BigTable para el análisis de uso y rutas.

Base de Datos de Grafos

Modelan los datos como nodos (entidades) y relaciones o aristas (conexiones entre entidades).

Ejemplo en una Red Social:

A → sigue a B
B → sigue a C
A → sigue a C
  • Permiten consultar relaciones complejas, como: ¿Quién sigue a C? ¿Qué usuarios están conectados indirectamente?
  • Usos: Sistemas de recomendación, detección de fraude, análisis de redes sociales.


Casos de Uso Reales: Bases de Datos de Grafos

Sistemas de Recomendación y Redes Sociales

  • LinkedIn y Facebook utilizan Neo4j y Apache Giraph para sugerencias de conexión.
  • Airbnb emplea grafos para recomendaciones y detección de fraude.

Resumen Comparativo de Tipos y Casos de Uso NoSQL

  • Clave-Valor: Acceso rápido a datos simples.

    • Uso: Sesiones, configuración, caché.
    • Ejemplo: Redis, DynamoDB.
  • Documental: Almacena documentos (JSON/BSON/XML), ofrece flexibilidad de esquema.

    • Uso: Catálogos, perfiles de usuario, aplicaciones dinámicas.
    • Ejemplo: MongoDB, CouchDB.
  • Orientada a Columnas: Optimizada para análisis y grandes volúmenes de datos.

    • Uso: Métricas, Big Data, almacenes de datos.
    • Ejemplo: Cassandra, HBase.
  • De Grafos: Modela nodos y relaciones complejas.

    • Uso: Redes sociales, sistemas de recomendación, detección de fraude.
    • Ejemplo: Neo4j, ArangoDB.

Elementos Clave en Bases de Datos NoSQL

  • Colecciones: Agrupan documentos (en bases de datos documentales).
  • Documentos: Objetos JSON/BSON con datos.
  • Claves y Valores: Pares para acceso rápido (en bases de datos clave-valor).
  • Familias de Columnas: Agrupan columnas bajo una clave (en bases de datos orientadas a columnas).
  • Nodos y Relaciones: Entidades y conexiones (en bases de datos de grafos).
  • Índices: Estructuras que aceleran las búsquedas.
  • Sharding: Técnica de partición de datos en múltiples servidores para escalabilidad.
  • Replicación: Copia de datos en varios servidores para seguridad y disponibilidad.

Ejemplos Prácticos de Elementos NoSQL

  • Colecciones: Una colección ‘usuarios’ con documentos JSON como {'nombre': 'Ana', 'edad': 30, 'email': 'ana@mail.com'}.
  • Clave-Valor: 'usuario:1023''activo'.
  • Column Families: 'cliente1'{nombre: 'Luis', compras: 5}.
  • Nodos y Relaciones: (Usuario)-[SIGUE]->(Usuario).
  • Índices: Un índice sobre el campo 'email' para búsquedas rápidas.
  • Sharding: Dividir los datos de usuarios por país (España, México, Argentina).
  • Replicación: Una copia sincronizada de la base de datos en varios servidores.


MongoDB vs. Bases de Datos Relacionales

Bases de Datos Relacionales:

Se basan en la organización de la información mediante la normalización, utilizando tablas, columnas, claves primarias y ajenas para establecer relaciones.

MongoDB (Base de Datos Documental):

Organiza la información en documentos flexibles. Emplea colecciones, documentos, campos y claves primarias para la identificación.

Ejemplo Comparativo:

  • Relacional: Se utilizan tablas separadas como Usuario y Dirección, con relaciones definidas entre ellas.
  • MongoDB: Un único documento puede unificar la información del usuario y su dirección, eliminando la necesidad de JOINs.

Ejemplo de Estructura de Datos: Relacional vs. MongoDB

  • Relacional:

    • Tabla: miembro
    • Registro: Fila de datos de un miembro
    • Campos: codmiembro, nif, nombre, …
  • MongoDB:

    • Colección: c_miembro
    • Documento: Objeto BSON (Binary JSON)
    • Campos: codmiembro, nif, nombre, …

    En MongoDB, los documentos se almacenan dentro de colecciones.

MongoDB: Operadores de Consulta

Operadores de Comparación:

  • $ne: No igual a
  • $gte: Mayor o igual que
  • $in: Dentro de un conjunto de valores

Ejemplos de Uso:

codmiembro != 5
alias is not null
codigoministerio >= 5
codmiembro in [1, 3, 5]

Operadores Lógicos:

  • $and: codigoministerio = 1 Y alias = 'Capitán América'
  • $or: codigoministerio = 1 O alias = 'Capitán América'
  • $nor: Ni codigoministerio = 1 Ni alias = 'Capitán América'


MongoDB Query Language (MQL)

Operaciones DDL (Data Definition Language):

  1. Crear base de datos.
  2. Usar base de datos.
  3. Crear Tabla/Colección.
  4. Mostrar en Cliente.
  5. Eliminar Tabla/Colección.
  6. Eliminar Base de Datos.

Operaciones CRUD (Create, Read, Update, Delete):

OperaciónDescripción
insertOne()Inserta un único documento.
insertMany()Inserta varios documentos.
findOne()Encuentra el primer documento que coincide con el criterio.
find()Encuentra todos los documentos que coinciden con el criterio.
updateOne()Actualiza campos del primer documento que coincide.
updateMany()Actualiza campos de todos los documentos que coinciden.
replaceOne()Reemplaza un documento por otro (se pierden campos no incluidos).
deleteOne()Elimina el primer documento que coincide.
deleteMany()Elimina todos los documentos que coinciden.

Consultas: MongoDB vs. Bases de Datos Relacionales

  • Consulta General: Devuelve todos los documentos de una colección (ej. c_ministerio).
  • Consulta por ID: Recupera un documento específico (ej. “miembro” con codmiembro = 1).
  • Consulta por Filtro: Recupera documentos filtrando por campos (ej. alias y código de ministerio).
  • Inserción: Añade uno o varios documentos (ej. “miembro”).
  • Actualización:
    • Un solo documento: Cambiar un campo (ej. alias cuando codmiembro = 4).
    • Varios documentos: Actualizar múltiples documentos que coincidan con un criterio.
  • Reemplazar Documento: Solo en MongoDB, no es posible en relacional con SQL de forma directa.
  • Borrado:
    • Por ID: Eliminar un documento específico (ej. con codmiembro = 17).
    • Por Filtro: Eliminar todos los documentos que coincidan con un criterio (ej. de un ministerio con código 7).


MongoDB: Agregaciones

La agregación en MongoDB permite procesar numerosos documentos de una colección, realizando cálculos y transformaciones avanzadas, a diferencia de las consultas regulares que devuelven documentos individuales. Este proceso es similar a la cláusula GROUP BY en bases de datos relacionales.

Funcionamiento de las Agregaciones:

Las agregaciones utilizan pipelines (tuberías), donde los datos pasan por una serie de etapas que los transforman o filtran secuencialmente.

Etapas Principales del Pipeline:

  • $group: Agrupa documentos y aplica funciones acumuladoras como $sum(), $avg(), $min(), $max().
  • $project: Selecciona, renombra y transforma campos.
  • $match: Filtra documentos (similar a la cláusula WHERE).
  • $sort: Ordena los documentos resultantes.
  • $limit: Limita la cantidad de documentos devueltos.
  • $lookup: Realiza un JOIN con otra colección.

Operadores y Funciones de Agregación

a) Operadores Aritméticos:

  • $add: Suma valores.
  • $subtract: Resta valores.
  • $multiply: Multiplica valores.
  • $divide: Divide valores.
  • $mod: Calcula el módulo.

b) Operadores de Cadena:

  • $concat: Concatena cadenas.
  • $toLower / $toUpper: Convierte a minúsculas/mayúsculas.
  • $strLenCP: Obtiene la longitud de una cadena.
  • $trim, $ltrim, $rtrim: Elimina espacios en blanco.
  • $replaceOne, $replaceAll: Realiza reemplazos de subcadenas.
  • $regexFind, $regexFindAll, $regexMatch: Operaciones con expresiones regulares.

c) Operadores de Fecha:

  • $dateFromString / $dateToString: Conversión entre cadena y fecha.
  • $dateFromParts / $dateToParts: Construcción o extracción de componentes de fechas.
  • $dayOfMonth, $dayOfWeek, $dayOfYear, $month, $year, $hour, $minute, $second, $week, $isoWeek, $isoDayOfWeek, $millisecond: Extraen componentes específicos de una fecha.
  • $add, $subtract: Suma o resta unidades de tiempo a una fecha.


d) Operadores de Grupo (Acumuladores):

  • $sum, $avg, $max, $min: Funciones estadísticas básicas.
  • $push: Agrega valores a una matriz.
  • $addToSet: Agrega valores a una matriz, pero solo si no están ya presentes (sin duplicados).
  • $first, $last: Obtienen el primer o último valor de un grupo.
  • $count: Cuenta documentos (equivalente a $sum: 1).

Ejemplos Prácticos de Operadores de Agregación

Ejemplo: $group

Agrupa por “producto” y suma “cantidad”:

db.ventas.aggregate([
  { "$group": { "_id": "$producto", "totalVendido": { "$sum": "$cantidad" } } }
])

Salida:

{ "_id": "Portátil", "totalVendido": 3 }
{ "_id": "Mouse", "totalVendido": 5 }

Ejemplo: $project

Selecciona solo los campos “producto” y “precio”:

db.ventas.aggregate([ { $project: { producto: 1, precio: 1 } } ])

Ejemplo: $match

Filtra por “precio > 100”:

db.ventas.aggregate([ { $match: { precio: { $gt: 100 } } } ])

Ejemplo: $sort

Ordena por “precio” descendente:

db.ventas.aggregate([ { $sort: { precio: -1 } } ])


Ejemplo: $limit

Devuelve solo los primeros 2 documentos:

db.ventas.aggregate([ { $limit: 2 } ])

Ejemplo: $lookup

Realiza un JOIN entre las colecciones “ventas” y “cliente”:

db.ventas.aggregate([
  { $lookup: {
    from: "cliente",
    localField: "clienteId",
    foreignField: "_id",
    as: "clienteData"
  } }
])

El resultado es que cada documento de venta incluirá un campo clienteData con los datos del cliente correspondiente, simulando un JOIN.