Want to create interactive content? It’s easy in Genially!

Get started free

AFI | Curso MongoDB 2024

elena.alcalacontrera

Created on December 25, 2023

Start designing with a free template

Discover more than 1500 professional designs like these:

Transcript

Fundamentos de bases de datos NoSQL: MongoDB

Elena Alcalá Contreras m.elenaalcala@gmail.com Engineering Lead - JLL/T Enero 2024

Índice

1. NoSQL: Conceptos clave

2. MongoDB: Conceptos y manejo

3. ATLAS Cloud: Práctica

4. Consultas en MongoDB

5. Ejercicios prácticos

6. MongoDB desde Python

7. Referencias

NoSQL Conceptos clave

Fundamentos BBDD NoSQL: MongoDB

¿Por qué NoSQL?

  • Estructuras no tabulares

documentos

grafos

Columnas

Pares clave-valor

  • Consulta y modificación no por SQL
  • Escalabilidad horizontal
  • Flexibilidad
  • No necesidad de escalabilidad vertical (hardware)

Fundamentos BBDD NoSQL: MongoDB

Paradigma MapReduce

Modelo de programación para dar soporte a la computación paralela sobre grandes colecciones de datos

suffle

map

reduce

Fundamentos BBDD NoSQL: MongoDB

Teorema CAP

CONSISTENCY

availability

partition tolerance

Imposible garantizar estas tres características simultáneamente en BBDD no relacionales

Fundamentos BBDD NoSQL: MongoDB

Modelo ACID vs BASE

ACID

BASE

  1. Atomic Transacciones completas
  2. Consistent Datos intactos
  3. Isolated Operaciones aisladas
  4. Durable Persistencia de la transacción
  1. Basic Availability Respuesta a cualquier solicitud
  2. Soft-state Mismo valor para un elemento si no se realizan actualizaciones
  3. Eventual consistency Propagación de actualizaciones

VS

Típico de BBDD no relacionales

Típico de BBDD relacionales

Fundamentos BBDD NoSQL: MongoDB

Bases de datos documentales

  • Tipo de bases de datos NoSQL en la que los datos están organizados en forma de documentos
  • Cada BD documental emplea un estándard específico para representar los documentos: XML, JSON/BSON, YAML
  • Tipología de uso basada en realización de muchas inserciones y consultas, pero muy pocas (o inexistentes) actualizaciones

No tienen esquemaCada documento puede tener conjunto distinto de campos

Jerarquía. Documentos embebidosUn campo puede tener otro documento asignado como valor

Tienen estructuraConjunto de campos y valores

Campos multivalor Un campo puede tener asignada una lista de valores

Fundamentos BBDD NoSQL: MongoDB

Objeto

JSON

Entero

Campo

Formato de texto plano ligero para intercambio de datos estructurados entre sistemas Costoso de almacenar. Usar el formato binario BSON para almacenamiento eficiente Leído por cualquier lenguaje de programación Alternativa a XML. Adopción directa en javascript

String

Data 3

Array

Tipos: número (entero/float), string (comillas dobles), booleano (true/false), array ([]), objeto ({}), null

MongoDB Conceptos y manejo

Fundamentos BBDD NoSQL: MongoDB

¿Qué es MongoDB?

  • Proviene de la palabra humongous
  • Es una base de datos NoSQL documental
  • Código abierto
  • No soporta SQL
  • Utiliza BSON para representar la información internamente
  • Acepta documentos JSON como fuente de información
  • Sigue modelo CP según teorema CAP

Fundamentos BBDD NoSQL: MongoDB

Breve Historia

2011Versión 1.4Uso en producción

2007Primera versión de MongoDB

2023Versión 7.0

2009Open Source Model

2016 Cloud - Database As a Service

Fundamentos BBDD NoSQL: MongoDB

Ventajas y Desventajas

VENTAJAS

DESVENTAJAS

  1. Schema-less
  2. 1 objeto = 1 documento = CLARIDAD
  3. Escalabilidad: SHARDING & REPLICATION
  4. Consulta potente por índices, storage encriptado y soporte GEO avanzado
  5. Documentación y herramientas
  6. Integración - drivers y librerías para lenguajes modernos
  1. No es sencillo realizar JOIN entre colecciones
  2. Limitación en tamaño de documentos a 16MB
  3. No garantiza ACID
  4. No recomendado para casos en que se tengan que realizar muchas actualizaciones

VS

Fundamentos BBDD NoSQL: MongoDB

¿Cuándo usar MongoDB?

  • Performance elevada en búsquedas
  • Sistemas con recursos geográficos
  • No es tan relevante garantizar ACID
  • Escenarios de BigData/DataHub
  • Cacheo

MongoDB es válido como sistema central de datos pero es el complemento perfecto a un RDBMS

Fundamentos BBDD NoSQL: MongoDB

Ejemplos reales de aplicación

Log de aplicación

Información geográfica y mapas

Configuración de aplicación

Motores de cálculo

Auditoría

Gestión de comentarios en redes, posts, replies

Repositorio testigos de mercado

MapReduce para análisis de datos

Fundamentos BBDD NoSQL: MongoDB

Elementos de MongoDB

Server

Document

Instancia de MongoDBExisten distintos tipos según rol

Conjunto de campos clave-valorSin esquema fijo Un documento pertenece a una única colección

Database

ObjectId

Contenedor de coleccionesPropio set de ficheros

Identificador únicoCreado, gestionado y asignado automáticamente

Collection

No existe concepto de FOREIGN KEY No existe concepto de JOIN

Agrupación de documentos similares o relacionadosCada colección pertenece a una única database

Fundamentos BBDD NoSQL: MongoDB

Documentos embebidos vs Referencias

Documentos embebidos

Referencias

  • Información relacionada que sufre cambios frecuentes
  • Información relacionada consumida de forma independiente
  • Varios niveles de relación
  • No actualización de información embebida
  • Consulta simultánea al documento principal
  • Número razonable de niveles

VS

  • Redundancia y mayor consumo de disco
  • Minimización del número de consultas
  • Poca redundancia y menor consumo
  • Múltiples consultas para obtener información completa

Fundamentos BBDD NoSQL: MongoDB

MongoDB vs RDBMS

Fundamentos BBDD NoSQL: MongoDB

Conceptos avanzados

Réplica

Son Mongos con la misma información. En MongoDB existe la auto-réplica, que mejora la redundancia y la capacidad de lectura

Sharding

Estrategia o método para distribuir datos en máquinas. Solo en casos de muchos datos, y las consultas se realizarán de forma distribuida. Esto complica la arquitectura

Modelización

El modelo de datos viene definido por el uso. Colecciones lo más homogéneas posible. ÍNDICES

Interacción

Tres formas de interacción

    • Consola cliente de MongoDB - menos útil
    • Aplicación cliente de MongoDB (Studio 3T, Robo 3T, Compass) - gestión cómoda
    • Conexión desde diferentes lenguajes de programación (Python, R, C#) - disposición de drivers

ATLAS Cloud Práctica

Fundamentos BBDD NoSQL: MongoDB

ATLAS Cloud

  • DBaaS: Servicio de base de datos Mongo como servicio
  • Servicio de "0 mantenimiento"
  • Servicio de pago por uso

VENTAJAS

DESVENTAJAS

  1. Alto coste para poco uso
  2. Posibles problemas para requerimientos particulares de seguridad
  1. A la larga, menor coste
  2. No CAPEX (bienes físicos) pero sí OPEX (operaciones y servicios)
  3. Mejor mantenimiento posible

VS

Fundamentos BBDD NoSQL: MongoDB

Guías

Robo 3T

MongoDB Atlas

Consultas en MongoDB

Fundamentos BBDD NoSQL: MongoDB

Interactuar con los datos

Crear colección

db.createCollection(<name>, <options>)

  • <name>: nombre de la colección
  • <options>: documento (opcional) para especificar opciones como tamaño máximo de la colección o número máximo de documentos

Eliminar colección

db.collection.drop()

Eliminar base de datos

db.dropDatabase()

Las operaciones de eliminar, borran la colección o base de datos junto con todo su contenido y NO SE PUEDEN DESHACER

Fundamentos BBDD NoSQL: MongoDB

CRUD

Create

insertOne(data, options)insertMany(data, options)

Read

find(filter, options)findOne(filter, options)

Update

updateOne(filter, data, options)updateMany(filter, data, options)replaceOne(filter, data, options)

Delete

deleteOne(filter, options)deleteMany(filter, options)

Fundamentos BBDD NoSQL: MongoDB

CRUD - Inserción documentos

db.collection.insertOne(<document>)db.collection.insertMany([<document>, <document>, ...])

[Mongo] db.collection.insertOne({ Field1: "Value1", Field2: Value2 })[SQL] INSERT INTO collection(Field1, Field2) VALUES ('Value1', Value2)

Al insertar varios documentos con la instrucción insertMany(), si alguno genera conflicto y no se puede insertar, automáticamente se PARA la inserción. Los documentos previos sí habrán sido insertados pero no el mencionado ni los siguientes. Para evitarlo, se puede emplear el comando: db.collection.insertMany([<document>, <document>, ...], {ordered: false}) que permite realizar aquellas inserciones que sean posibles y mostrar un error final indicando qué documentos no se han podido insertar en la colección.

Fundamentos BBDD NoSQL: MongoDB

CRUD - Inserción documentos - Ejemplo

  1. Crear una colección con el nombre TEST_COLLECTION
  2. Añadir un documento con la siguiente información:

Fundamentos BBDD NoSQL: MongoDB

CRUD - Inserción documentos - Ejemplo

3. Añadir dos documentos con la misma estructura que el anterior y esta información:

Fundamentos BBDD NoSQL: MongoDB

CRUD - Recuperación documentos

db.collection.find(<filter>)

  • <filter>: documento con definición de filtros a aplicar. Si no se quiere aplicar ningún filtro, se puede omitir el parámetro o emplear el documento vacio {}

[Mongo] db.collection.find()[SQL] SELECT * FROM collection[Mongo] db.collection.find({ Field1: "Value1" })[SQL] SELECT * FROM collection WHERE Field1 = 'Value1'

Fundamentos BBDD NoSQL: MongoDB

CRUD - Recuperación documentos

Comparación

Estructura

Fundamentos BBDD NoSQL: MongoDB

CRUD - Recuperación documentos

Lógicos

Evaluación

Fundamentos BBDD NoSQL: MongoDB

CRUD - Recuperación documentos

Anidados

Arrays

Fundamentos BBDD NoSQL: MongoDB

CRUD - Recuperación documentos - Ejemplo

  1. Recuperar aquellos documentos cuyo campo item sea igual a “AFI”
  2. Recuperar aquellos documentos cuyo campo qty sea mayor que 100
  3. Recuperar aquellos documentos cuyo campo width sea menor que 300
  4. Recuperar aquellos documentos que contengan el tag “white”
  5. Recuperar aquellos documentos que tengan únicamente dos tags
  6. Recuperar aquellos documentos cuyo campo height sea menor o igual a 8000 y cuyo campo qty sea mayor que 500

Fundamentos BBDD NoSQL: MongoDB

CRUD - Contar documentos y seleccionar campos

Contar resultados de una consulta

db.collection.count()db.collection.count(<filter>)db.collection.find(<filter>).count()

[Mongo] db.collection.count({ Field1: "Value1" })[SQL] SELECT COUNT(*) FROM collection WHERE Field1 = 'Value1'

Seleccionar campos a mostrar en los documentos devueltos

db.collection.find(<filter>, <projection>)

  • <filter>: documento con los filtros a aplicar - si es necesario -
  • <projection>: documento que contiene, como claves, los nombres de los campos que existen en el documento y, como valores, un flag 0/1 indicando si se quiere mostrar o no

[Mongo] db.collection.find({}, { Field1: 1, Field2: 1, Field3: 0 })[SQL] SELECT Field1, Field2 FROM collection

Fundamentos BBDD NoSQL: MongoDB

CRUD - Limitar y ordenar resultados

Limitación sobre el número de documentos devueltos

db.collection.find(<filter>).limit(<limit>).skip(<skip>)

  • <limit>: número máximo de resultados a devolver
  • <skip>: número de documentos que se quieren saltar

[Mongo] db.collection.find().limit(10).skip(5)[SQL] SELECT * FROM collection OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY

Ordenación sobre documentos devueltos

db.collection.find(<filter>).sort(<criteria>)

  • <criteria>: documento que contiene, como claves, los nombres de los campos por los que se quiere ordenar y, como valores, un flag 1/-1 indicando si la ordenación es ascendente o descendente

[Mongo] db-collection.find({ Field1: "Value1" }).sort({ Field1: -1 })[SQL] SELECT * FROM collection WHERE Field1 = 'Value1' ORDER BY Field1 DESC

Fundamentos BBDD NoSQL: MongoDB

CRUD - Valores no duplicados

db.collection.distinct(<field>, <query>)

  • <field>: campo para el que se quieren obtener valores sin duplicados
  • <query>: query opcional para especificar el filtro previo a la selección de no duplicados

[Mongo] db.collection.distinct( "Field1", { Field3: "Value3" })[SQL] SELECT DISTINCT Field1 FROM collection WHERE Field3 = 'Value3'

Fundamentos BBDD NoSQL: MongoDB

CRUD - Agrupación

db.collection.aggregate([<stage1>, <stage2>, ...])

  • <stage>: cada elemento o paso involucrado en la operación de agregación. El orden es muy importante, ya que el resultado de cada stage funciona como documento de entrada al siguiente. El único stage que tiene acceso al documento original es el primero.

Operaciones

    • $match: filtrado de resultados
    • $group: criterios de agrupación y resultados agregados
    • $projection: filtrado de campos y posibilidad de crear nuevos
    • $sort: ordenación de resultados
    • $limit/$skip: limitación y salto de resultados
    • $bucket: información agrupada por categorías y con estadísticas generadas
    • $out: resultado en una nueva colección o en una ya existente

Fundamentos BBDD NoSQL: MongoDB

CRUD - Más funciones - Ejemplo

  1. ¿Cuántos documentos hay en la colección?
  2. ¿Cuántos documentos tienen el campo width menor que 100?
  3. Mostrar únicamente los campos item y qty de aquellos documentos que contengan el tag "orange"
  4. Devolver todos los documentos ordenados por el campo qty descendente
  5. ¿Cuántos valores distintos hay para el campo item?
  6. Obtener la suma del campo qty de aquellos documentos que tengan los mismos tags

Fundamentos BBDD NoSQL: MongoDB

CRUD - Actualización documentos

db.collection.updateOne(<filter>, <update>)db.collection.updateMany(<filter>, <update>)db.collection.replaceOne(<filter>, <update>)

  • <filter>: documento con definición de filtros a aplicar para seleccionar los documentos que se quieren actualizar
  • <update>: documento que contiene el conjunto de actualizaciones a llevar a cabo sobre los documentos filtrados

[Mongo] db.collection.updateMany({}, { Field1: "Value1"})[SQL] UPDATE collection SET Field1 = 'Value1'[Mongo] db.collection.updateMany({ Field3: Value3 }, { Field2: "Value2" })[SQL] UPDATE collection SET Field2 = 'Value2' WHERE Field3=Value3

Fundamentos BBDD NoSQL: MongoDB

CRUD - Actualización documentos

Acciones de actualización

Fundamentos BBDD NoSQL: MongoDB

CRUD - Actualización documentos - Ejemplo

  1. Renombrar el campo item por name
  2. Añadir un nuevo tag a todos los documentos con el valor black SIN duplicar en aquellos que ya lo tengan
  3. Incrementar en 10 unidades el valor del campo qty

Fundamentos BBDD NoSQL: MongoDB

CRUD - Eliminación documentos

db.collection.deleteOne(<filter>)db.collection.deleteMany(<filter>)

  • <filter>: documento con definición de filtros a aplicar para seleccionar los documentos que se quieren borrar

[Mongo] db.collection.deleteOne({ Field1: "Value1" })[SQL] DELETE FROM collection WHERE Field1='Value1'

Fundamentos BBDD NoSQL: MongoDB

CRUD - Eliminación documentos - Ejemplo

  1. Eliminar todos los documentos que no tengan nombre “AFI”
  2. Borrar la colección

Fundamentos BBDD NoSQL: MongoDB

Índices

Se pueden crear índices para un único campo, para varios combinados e incluso índices espaciales para geometrías

Borrar índice

Mostrar índices

db.collection.getIndexes()

db.collection.dropIndex({ <key> : 1 })

Crear índice

db.collection.createIndex({ <key1> : 1, <key2> : -1})

El flag 1/-1 indica si el índice se genera de forma ascendente o descendente. También se puede indicar el tipo de índice: unique, partial, sparse...

Índice de texto

db.collection.createIndex({ <key> : "text" })

Permite evitar el uso de expresiones regulares, y usarlo como tal al combinar con el comando $search en las funciones find() que se apliquen sobre el campo indexado como texto

Índice espacial

db.collection.createIndex({ <key> : "2dsphere"})

Fundamentos BBDD NoSQL: MongoDB

Geometrías espaciales

  • MongoDB admite información y procesamiento geográfico
  • Presenta mejor rendimiento que RDBMS con soporte geoespacial
  • Gestiona los datos por medio de:
    • Índices
    • Limitado a polígonos válidos y sin cruces
    • Utiliza SRID EPSG:4326
    • Permite buscar: intersecciones, inclusiones, cercanía, dentro de...
  • Admite objetos GeoJSON

<field>: { type: <GeoJSON type> , coordinates: <coordinates> }

  • Point / Multipoint
  • LineString/ MultiLineString
  • Polygon / MultiPolygon
  • GeometryCollection

Fundamentos BBDD NoSQL: MongoDB

Geometrías espaciales

Las geometrías tipo círculo y rectángulo no tienen representación pura, pero se representan mediante los siguientes símiles:

Círculo

Rectángulo

Representación especial en base a las esquinas Suroeste (SW) y Noreste (NE)

$geometry: { type: "Point", coordinates: [-3.489273, 40.583927]},$maxDistance: 100

$box: [[-3.895732, 40.589372], [-3.589327, 40.589327]]

Fundamentos BBDD NoSQL: MongoDB

Consultas espaciales - $near

Devuelve las geometrías que se encuentran cercanas a un punto dado

Los documentos devueltos vienen ordenados por distancia

  • <location_field>: campo con índice 2dsphere
  • $geometry: definición del punto
  • $maxDistance: radio del círculo de búsqueda
  • $minDistance: campo opcional que permite búsquedas en una rosquilla

Fundamentos BBDD NoSQL: MongoDB

Consultas espaciales - $geoIntersects

Encuentra la intersección entre geometrías. La intersección se da cuando uno de los puntos de la geometría de los elementos buscados pertenece a la geometría pasada como parámetro

  • <location_field>: campo con índice 2dsphere
  • $geometry: definición de la geometría por la que se busca

Fundamentos BBDD NoSQL: MongoDB

Consultas espaciales - $geoWithin (I)

Caso particular de la intersección - geometrías contenidas dentro de otra geometría pasada por referencia

  • <location_field>: campo con índice 2dsphere
  • $geometry: definición de la geometría por la que se busca

Fundamentos BBDD NoSQL: MongoDB

Consultas espaciales - $geoWithin (II)

Rectángulo

Polígono

Círculo

Ejercicios prácticos

Fundamentos BBDD NoSQL: MongoDB

Algunas preguntas

  • ¿Cuántos índices hay en la colección?
    • Crear índice de tipo texto para el campo categories
    • Crear índice para el campo postal_code
    • ¿Cuántos índices hay en la colección?
  • ¿Cuántos documentos hay en la colección?
  • ¿Qué negocios tienen como código postal el 97210?
  • ¿Cuántos negocios permiten la entrada de perros?
  • ¿Cuál es nombre del negocio con mejor puntuación y mayor número de opiniones?
  • ¿Cuántos códigos postales diferentes hay en la muestra?
  • ¿Cuántos negocios hay en cada ciudad?

Fundamentos BBDD NoSQL: MongoDB

Algunas preguntas

  • ¿Cuántos negocios hay en torno al punto (-81.564481, 28.468456) en 5 kilómetros? (PASOS):
    • Crear una nueva colección generando el campo location de tipo GeoJSON a partir de las coodenadas
    • Generar el índice geoespacial en esta nueva colección y para el nuevo campo
    • Realizar la consulta pertinente

Fundamentos BBDD NoSQL: MongoDB

Soluciones

  • ¿Cuántos índices hay en la colección?
    • Crear índice de tipo texto para el campo categories
    • Crear índice para el campo postal_code
    • ¿Cuántos índices hay en la colección?

Fundamentos BBDD NoSQL: MongoDB

Soluciones

  • ¿Cuántos documentos hay en la colección?
  • ¿Qué negocios tienen como código postal el 97210?
  • ¿Cuántos negocios permiten la entrada de perros?

Fundamentos BBDD NoSQL: MongoDB

Soluciones

  • ¿Cuál es nombre del negocio con mejor puntuación y mayor número de opiniones?

db.TestMDS.aggregate([ { $sort: { stars: -1, review_count: -1 }}, { $limit: 1 }, { $project: { name: 1, _id: 0 }} ])

Mudra Massage

  • ¿Cuántos códigos postales diferentes hay en la muestra?

Fundamentos BBDD NoSQL: MongoDB

Soluciones

  • ¿Cuántos negocios hay en cada ciudad?

Listado de documentos con el nombre de la ciudad y el número de negocios en cada una

db.TestMDS.aggregate([ { $group: { _id: { cityName: "$city" }, numBusiness: { $sum: 1 } } } ])

Fundamentos BBDD NoSQL: MongoDB

Soluciones

  • ¿Cuántos negocios hay en torno al punto (-81.564481, 28.468456) en 5 kilómetros?

db.TestMDS.aggregate([ { $project: { _id: 0, name: 1, stars: 1, review_count: 1, hasWifi: "$attributes.WiFi", hasHappyHour: "$attributes.HappyHour", hasDelivery: "$attributes.RestaurantesDelivery", location: { type: "Point", coordinates: [ "$longitude", "$latitude" ] } } }, { $out: "newTestMDS" } ])

Nueva colección con campos seleccionados y campo geométrico

Fundamentos BBDD NoSQL: MongoDB

Soluciones

  • ¿Cuántos negocios hay en torno al punto (-81.564481, 28.468456) en 5 kilómetros?

db.newTestMDS.find({ location: { $near: { $geometry: { type: "Point", coordinates: [-81.564481, 28.468456] }, $maxDistance: 5000 } } }).count()

MongoDB desde Python

Fundamentos BBDD NoSQL: MongoDB

¿Por qué Python?

  • Al ser un lenguaje de tipado dinámico encaja perfectamente con el paradigma schema-less de MongoDB
  • Excelente manejo de diccionarios
  • Compatibilidad de librerías python con MongoDB
  • Driver recomendado: pymongo
  • En el IDE de Python que tengamos instalado - preferiblemente Spyder o PyCharm
    • Comprobar que tenemos pymongo instalado ejecutando import pymongo
      • Si no está instalado, ejecutar conda install pymongo

Fundamentos BBDD NoSQL: MongoDB

Practicando con Python y MongoDB

  • Establecer conexión con las bases de datos de MongoDB desde Python
  • Trabajar con las bases de datos
  • Trabajar con las colecciones y los documentos
    • Limpieza de datos
    • Estandarización de información
    • Uso de pandas
    • Creación de índices

Fundamentos BBDD NoSQL: MongoDB

Práctica Python - Enunciados

Conexión MongoDB

Colecciones y documentos

Trabajando con los datos

Fundamentos BBDD NoSQL: MongoDB

Práctica Python - Soluciones

Conexión MongoDB

Colecciones y documentos

Trabajando con los datos

Fundamentos BBDD NoSQL: MongoDB

Práctica Python - Resumen

  • Crear la conexión
  • Probar la conexión. Por ejemplo, listando las bases de datos existentes
  • Acceder a una base de datos

El acceso por parámetro del primer ejemplo será la opción preferida.La segunda vía se usará si el nombre de la base de datos genera conflicto o su valor viene de otra variable. El último ejemplo será útil cuando queramos añadir configuración determinada.

Fundamentos BBDD NoSQL: MongoDB

Práctica Python - Resumen

  • Listar colecciones de una base de datos
  • Crear y eliminar colecciones
  • Consultar dentro de colecciones

Fundamentos BBDD NoSQL: MongoDB

Práctica Python - Resumen

  • Insertar documentos en colecciones
  • Importar desde un fichero .json

Fundamentos BBDD NoSQL: MongoDB

Práctica Python - Resumen

  • Actualizar documentos
  • Crear índices

Referencias

Fundamentos BBDD NoSQL: MongoDB

Referencias

Documentación oficial de MongoDB

Tutoriales de MongoDB

Tutorial Pymongo