Want to make creations as awesome as this one?

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

  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

BASE

  1. Atomic Transacciones completas
  2. Consistent Datos intactos
  3. Isolated Operaciones aisladas
  4. 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

  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

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

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

  1. Alto coste para poco uso
  2. Posibles problemas para requerimientos particulares de seguridad

DESVENTAJAS

  1. A la larga, menor coste
  2. No CAPEX (bienes físicos) pero sí OPEX (operaciones y servicios)
  3. 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

  1. Crear una colección con el nombre TEST_COLLECTION
  2. 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

  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

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

  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

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

  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

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

  1. Eliminar todos los documentos que no tengan nombre “AFI”
  2. 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