Want to create interactive content? It’s easy in Genially!
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
- Atomic Transacciones completas
- Consistent Datos intactos
- Isolated Operaciones aisladas
- Durable Persistencia de la transacción
- Basic Availability Respuesta a cualquier solicitud
- Soft-state Mismo valor para un elemento si no se realizan actualizaciones
- 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
- Schema-less
- 1 objeto = 1 documento = CLARIDAD
- Escalabilidad: SHARDING & REPLICATION
- Consulta potente por índices, storage encriptado y soporte GEO avanzado
- Documentación y herramientas
- Integración - drivers y librerías para lenguajes modernos
- No es sencillo realizar JOIN entre colecciones
- Limitación en tamaño de documentos a 16MB
- No garantiza ACID
- 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
- Alto coste para poco uso
- Posibles problemas para requerimientos particulares de seguridad
- A la larga, menor coste
- No CAPEX (bienes físicos) pero sí OPEX (operaciones y servicios)
- 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
- Crear una colección con el nombre TEST_COLLECTION
- 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
- Recuperar aquellos documentos cuyo campo item sea igual a “AFI”
- Recuperar aquellos documentos cuyo campo qty sea mayor que 100
- Recuperar aquellos documentos cuyo campo width sea menor que 300
- Recuperar aquellos documentos que contengan el tag “white”
- Recuperar aquellos documentos que tengan únicamente dos tags
- 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
- ¿Cuántos documentos hay en la colección?
- ¿Cuántos documentos tienen el campo width menor que 100?
- Mostrar únicamente los campos item y qty de aquellos documentos que contengan el tag "orange"
- Devolver todos los documentos ordenados por el campo qty descendente
- ¿Cuántos valores distintos hay para el campo item?
- 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
- Renombrar el campo item por name
- Añadir un nuevo tag a todos los documentos con el valor black SIN duplicar en aquellos que ya lo tengan
- 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
- Eliminar todos los documentos que no tengan nombre “AFI”
- 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