AFI | Curso MongoDB 2024
elena.alcalacontrera
Created on December 25, 2023
More creations to inspire you
STAGE2- LEVEL1-MISSION 2: ANIMATION
Presentation
TANGRAM PRESENTATION
Presentation
VALENTINE'S DAY PRESENTATION
Presentation
HUMAN RIGHTS
Presentation
LIBRARIES LIBRARIANS
Presentation
IAU@HLPF2019
Presentation
SPRING IN THE FOREST 2
Presentation
Transcript
Fundamentos de bases de datos NoSQL: MongoDB
Elena Alcalá Contrerasm.elenaalcala@gmail.comEngineering Lead - JLL/TEnero 2024
7. Referencias
6. MongoDB desde Python
5. Ejercicios prácticos
4. Consultas en MongoDB
3. ATLAS Cloud: Práctica
2. MongoDB: Conceptos y manejo
1. NoSQL: Conceptos clave
Índice
NoSQLConceptos clave
Fundamentos BBDD NoSQL: MongoDB
grafos
Pares clave-valor
Columnas
documentos
- Consulta y modificación no por SQL
- Escalabilidad horizontal
- Flexibilidad
- No necesidad de escalabilidad vertical (hardware)
¿Por qué NoSQL?
- Estructuras no tabulares
reduce
suffle
Fundamentos BBDD NoSQL: MongoDB
map
Paradigma MapReduce
Modelo de programación para dar soporte a la computación paralela sobre grandes colecciones de datos
Imposible garantizar estas tres características simultáneamente en BBDD no relacionales
CONSISTENCY
partition tolerance
availability
Fundamentos BBDD NoSQL: MongoDB
Teorema CAP
Fundamentos BBDD NoSQL: MongoDB
Típico de BBDD no relacionales
Típico de BBDD relacionales
- Basic Availability Respuesta a cualquier solicitud
- Soft-state Mismo valor para un elemento si no se realizan actualizaciones
- Eventual consistency Propagación de actualizaciones
BASE
- Atomic Transacciones completas
- Consistent Datos intactos
- Isolated Operaciones aisladas
- Durable Persistencia de la transacción
ACID
VS
Modelo ACID vs BASE
Fundamentos BBDD NoSQL: MongoDB
Jerarquía. Documentos embebidosUn campo puede tener otro documento asignado como valor
Campos multivalorUn campo puede tener asignada una lista de valores
No tienen esquemaCada documento puede tener conjunto distinto de campos
Tienen estructuraConjunto de campos y valores
- 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
Bases de datos documentales
Tipos: número (entero/float), string (comillas dobles), booleano (true/false), array ([]), objeto ({}), null
Array
String
Entero
Objeto
Campo
Data 3
Fundamentos BBDD NoSQL: MongoDB
Formato de texto plano ligero para intercambio de datos estructurados entre sistemasCostoso de almacenar. Usar el formato binario BSON para almacenamiento eficienteLeído por cualquier lenguaje de programaciónAlternativa a XML. Adopción directa en javascript
JSON
MongoDBConceptos 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
2011Versión 1.4Uso en producción
Fundamentos BBDD NoSQL: MongoDB
2016Cloud - Database As a Service
2009Open Source Model
2023Versión 7.0
Breve Historia
2007Primera versión de MongoDB
Fundamentos BBDD NoSQL: MongoDB
- 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
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
VENTAJAS
VS
Ventajas y Desventajas
Fundamentos BBDD NoSQL: MongoDB
MongoDB es válido como sistema central de datos pero es el complemento perfecto a un RDBMS
¿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
MapReduce para análisis de datos
Repositorio testigos de mercado
Gestión de comentarios en redes, posts, replies
Auditoría
Ejemplos reales de aplicación
Motores de cálculo
Configuración de aplicación
Información geográfica y mapas
Log de aplicación
Fundamentos BBDD NoSQL: MongoDB
No existe concepto de FOREIGN KEYNo existe concepto de JOIN
Agrupación de documentos similares o relacionadosCada colección pertenece a una única database
Collection
Contenedor de coleccionesPropio set de ficheros
Database
Elementos de MongoDB
Conjunto de campos clave-valorSin esquema fijoUn documento pertenece a una única colección
Identificador únicoCreado, gestionado y asignado automáticamente
Fundamentos BBDD NoSQL: MongoDB
Document
ObjectId
Instancia de MongoDBExisten distintos tipos según rol
Server
Fundamentos BBDD NoSQL: MongoDB
- Poca redundancia y menor consumo
- Múltiples consultas para obtener información completa
- Redundancia y mayor consumo de disco
- Minimización del número de consultas
- Información relacionada que sufre cambios frecuentes
- Información relacionada consumida de forma independiente
- Varios niveles de relación
Referencias
- No actualización de información embebida
- Consulta simultánea al documento principal
- Número razonable de niveles
Documentos embebidos
VS
Documentos embebidos vs Referencias
Fundamentos BBDD NoSQL: MongoDB
MongoDB vs RDBMS
Fundamentos BBDD NoSQL: MongoDB
- 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
Tres formas de interacción
El modelo de datos viene definido por el uso. Colecciones lo más homogéneas posible. ÍNDICES
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
Interacción
Modelización
Sharding
Réplica
Conceptos avanzados
Son Mongos con la misma información. En MongoDB existe la auto-réplica, que mejora la redundancia y la capacidad de lectura
ATLAS CloudPráctica
Fundamentos BBDD NoSQL: MongoDB
- Alto coste para poco uso
- Posibles problemas para requerimientos particulares de seguridad
DESVENTAJAS
- A la larga, menor coste
- No CAPEX (bienes físicos) pero sí OPEX (operaciones y servicios)
- Mejor mantenimiento posible
VENTAJAS
VS
ATLAS Cloud
- DBaaS: Servicio de base de datos Mongo como servicio
- Servicio de "0 mantenimiento"
- Servicio de pago por uso
Fundamentos BBDD NoSQL: MongoDB
Robo 3T
MongoDB Atlas
Guías
Consultas en MongoDB
Fundamentos BBDD NoSQL: MongoDB
Las operaciones de eliminar, borran la colección o base de datos junto con todo su contenido y NO SE PUEDEN DESHACER
Eliminar base de datos
db.dropDatabase()
Eliminar colección
db.collection.drop()
- <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
Crear colección
Interactuar con los datos
db.createCollection(<name>, <options>)
Fundamentos BBDD NoSQL: MongoDB
Delete
deleteOne(filter, options)deleteMany(filter, options)
Read
find(filter, options)findOne(filter, options)
Update
updateOne(filter, data, options)updateMany(filter, data, options)replaceOne(filter, data, options)
Create
insertOne(data, options)insertMany(data, options)
CRUD
Fundamentos BBDD NoSQL: MongoDB
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.
[Mongo] db.collection.insertOne({ Field1: "Value1", Field2: Value2 })[SQL] INSERT INTO collection(Field1, Field2) VALUES ('Value1', Value2)
CRUD - Inserción documentos
db.collection.insertOne(<document>)db.collection.insertMany([<document>, <document>, ...])
Fundamentos BBDD NoSQL: MongoDB
- Crear una colección con el nombre TEST_COLLECTION
- Añadir un documento con la siguiente información:
CRUD - Inserción documentos - Ejemplo
Fundamentos BBDD NoSQL: MongoDB
3. Añadir dos documentos con la misma estructura que el anterior y esta información:
CRUD - Inserción documentos - Ejemplo
Fundamentos BBDD NoSQL: MongoDB
- <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'
CRUD - Recuperación documentos
db.collection.find(<filter>)
Fundamentos BBDD NoSQL: MongoDB
Estructura
Comparación
CRUD - Recuperación documentos
Fundamentos BBDD NoSQL: MongoDB
Evaluación
Lógicos
CRUD - Recuperación documentos
Fundamentos BBDD NoSQL: MongoDB
Arrays
Anidados
CRUD - Recuperación documentos
Fundamentos BBDD NoSQL: MongoDB
- 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
CRUD - Recuperación documentos - Ejemplo
Fundamentos BBDD NoSQL: MongoDB
[Mongo] db.collection.find({}, { Field1: 1, Field2: 1, Field3: 0 })[SQL] SELECT Field1, Field2 FROM collection
Seleccionar campos a mostrar en los documentos devueltos
db.collection.find(<filter>, <projection>)
Contar resultados de una consulta
db.collection.count()db.collection.count(<filter>)db.collection.find(<filter>).count()
- <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.count({ Field1: "Value1" })[SQL] SELECT COUNT(*) FROM collection WHERE Field1 = 'Value1'
CRUD - Contar documentos y seleccionar campos
Fundamentos BBDD NoSQL: MongoDB
[Mongo] db-collection.find({ Field1: "Value1" }).sort({ Field1: -1 })[SQL] SELECT * FROM collection WHERE Field1 = 'Value1' ORDER BY Field1 DESC
- <limit>: número máximo de resultados a devolver
- <skip>: número de documentos que se quieren saltar
Ordenación sobre documentos devueltos
db.collection.find(<filter>).sort(<criteria>)
Limitación sobre el número de documentos devueltos
db.collection.find(<filter>).limit(<limit>).skip(<skip>)
- <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().limit(10).skip(5)[SQL] SELECT * FROM collection OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY
CRUD - Limitar y ordenar resultados
Fundamentos BBDD NoSQL: MongoDB
- <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
db.collection.distinct(<field>, <query>)
[Mongo] db.collection.distinct( "Field1", { Field3: "Value3" })[SQL] SELECT DISTINCT Field1 FROM collection WHERE Field3 = 'Value3'
CRUD - Valores no duplicados
Fundamentos BBDD NoSQL: MongoDB
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
- <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.
db.collection.aggregate([<stage1>, <stage2>, ...])
CRUD - Agrupación
Fundamentos BBDD NoSQL: MongoDB
- ¿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
CRUD - Más funciones - Ejemplo
Fundamentos BBDD NoSQL: MongoDB
- <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
db.collection.updateOne(<filter>, <update>)db.collection.updateMany(<filter>, <update>)db.collection.replaceOne(<filter>, <update>)
CRUD - Actualización documentos
Fundamentos BBDD NoSQL: MongoDB
Acciones de actualización
CRUD - Actualización documentos
Fundamentos BBDD NoSQL: MongoDB
- 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
CRUD - Actualización documentos - Ejemplo
Fundamentos BBDD NoSQL: MongoDB
- <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'
db.collection.deleteOne(<filter>)db.collection.deleteMany(<filter>)
CRUD - Eliminación documentos
Fundamentos BBDD NoSQL: MongoDB
- Eliminar todos los documentos que no tengan nombre “AFI”
- Borrar la colección
CRUD - Eliminación documentos - Ejemplo
Fundamentos BBDD NoSQL: MongoDB
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
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 espacial
db.collection.createIndex({ <key> : "2dsphere"})
Índice de texto
db.collection.createIndex({ <key> : "text" })
Borrar índice
db.collection.dropIndex({ <key> : 1 })
Crear índice
db.collection.createIndex({ <key1> : 1, <key2> : -1})
Mostrar índices
db.collection.getIndexes()
Se pueden crear índices para un único campo, para varios combinados e incluso índices espaciales para geometrías
Índices
Fundamentos BBDD NoSQL: MongoDB
- Point / Multipoint
- LineString/ MultiLineString
- Polygon / MultiPolygon
- GeometryCollection
<field>: { type: <GeoJSON type> , coordinates: <coordinates> }
- 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
Geometrías espaciales
Fundamentos BBDD NoSQL: MongoDB
Representación especial en base a las esquinas Suroeste (SW) y Noreste (NE)
Rectángulo
$box: [[-3.895732, 40.589372], [-3.589327, 40.589327]]
Círculo
$geometry: { type: "Point", coordinates: [-3.489273, 40.583927]},$maxDistance: 100
Las geometrías tipo círculo y rectángulo no tienen representación pura, pero se representan mediante los siguientes símiles:
Geometrías espaciales
Fundamentos BBDD NoSQL: MongoDB
- <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
Los documentos devueltos vienen ordenados por distancia
Devuelve las geometrías que se encuentran cercanas a un punto dado
Consultas espaciales - $near
Fundamentos BBDD NoSQL: MongoDB
- <location_field>: campo con índice 2dsphere
- $geometry: definición de la geometría por la que se busca
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
Consultas espaciales - $geoIntersects
Fundamentos BBDD NoSQL: MongoDB
- <location_field>: campo con índice 2dsphere
- $geometry: definición de la geometría por la que se busca
Caso particular de la intersección - geometrías contenidas dentro de otra geometría pasada por referencia
Consultas espaciales - $geoWithin (I)
Fundamentos BBDD NoSQL: MongoDB
Polígono
Círculo
Rectángulo
Consultas espaciales - $geoWithin (II)
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?
- ¿Cuántos negocios permiten la entrada de perros?
- ¿Qué negocios tienen como código postal el 97210?
Fundamentos BBDD NoSQL: MongoDB
Soluciones
- ¿Cuántos documentos hay en la colección?
- ¿Cuántos códigos postales diferentes hay en la muestra?
Mudra Massage
db.TestMDS.aggregate([ { $sort: { stars: -1, review_count: -1 }}, { $limit: 1 }, { $project: { name: 1, _id: 0 }}])
Fundamentos BBDD NoSQL: MongoDB
Soluciones
- ¿Cuál es nombre del negocio con mejor puntuación y mayor número de opiniones?
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 cada ciudad?
Nueva colección con campos seleccionados y campo geométrico
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" } ])
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()
Fundamentos BBDD NoSQL: MongoDB
Soluciones
- ¿Cuántos negocios hay en torno al punto (-81.564481, 28.468456) en 5 kilómetros?
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
Trabajando con los datos
Colecciones y documentos
Conexión MongoDB
Fundamentos BBDD NoSQL: MongoDB
Práctica Python - Enunciados
Trabajando con los datos
Colecciones y documentos
Conexión MongoDB
Fundamentos BBDD NoSQL: MongoDB
Práctica Python - Soluciones
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.
- Acceder a una base de datos
- Probar la conexión. Por ejemplo, listando las bases de datos existentes
- Crear la conexión
Fundamentos BBDD NoSQL: MongoDB
Práctica Python - Resumen
- Consultar dentro de colecciones
- Crear y eliminar colecciones
- Listar colecciones de una base de datos
Fundamentos BBDD NoSQL: MongoDB
Práctica Python - Resumen
- Importar desde un fichero .json
- Insertar documentos en colecciones
Fundamentos BBDD NoSQL: MongoDB
Práctica Python - Resumen
- Crear índices
- Actualizar documentos
Fundamentos BBDD NoSQL: MongoDB
Práctica Python - Resumen
Referencias
Fundamentos BBDD NoSQL: MongoDB
Tutorial Pymongo
Tutoriales de MongoDB
Documentación oficial de MongoDB
Referencias