Slide 1

Slide 1 text

MONGODB 101 por José Miguel Franco Valiente y César Suárez Ortega II Jornadas Técnicas UEx – CIEMAT: Introducción a NoSQL con MongoDB 9 – 11 de Febrero, 2016

Slide 2

Slide 2 text

@josemi_fv [email protected] josemifv

Slide 3

Slide 3 text

@tharandur [email protected] csuarez

Slide 4

Slide 4 text

CETA-CIEMAT Centro Extremeño de Tecnologías Avanzadas MICIN, CIEMAT Junta de Extremadura Ayuntamiento de Trujillo Establecer puentes, “unir está en nuestras manos” Computación y Ciencia (E-Ciencia) Ciencia, Industria y Sociedad América Latina ßà Extremadura ßàCIEMAT Fondo Europeo de Desarrollo Regional (FEDER) Obra Civil Infraestructura tecnológica Colaboraciones y proyectos de I+D

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

CETA-CIEMAT Conventual de San Francisco (s. XVI) 900m2, oficinas, despachos, salas Vigilancia 24x7 Centro de Procesamiento de Datos > 1 PB almacenamiento (+ 60Gbps) > 140 TFlops (HPC, GPGPU, MPI, NUMA) 3.000 cores CPU; 125.000 cores GPU Conectividad Regional (RCTex) y nacional (RedIRIS-NOVA) 2x10 Gbps Referente nacional e internacional Nvidia Research Center (desde 2013) IBERGRID – España y Portugal SCALAC – América Latina y Caribe Iniciativas Grid y Cloud Europeas (EGI, EFC)

Slide 7

Slide 7 text

Centro de Investigaciones Energéticas Medioambientales y Tecnológicas Organismo Público de Investigación Ministerio de Economía y Competitividad Secretaría de Estado de I+D+i I+D+i en… Energía Medioambiente Tecnología Investigación básica Algunos datos… Recursos humanos: 1.326 personas Presupuesto (2013): 98,3M € Ingresos actividades I+D+i (2013): 44,21M € CIEMAT

Slide 8

Slide 8 text

CIEMAT

Slide 9

Slide 9 text

Contenido Introducción e instalación básica Operaciones CRUD Modelado de datos Rendimiento y agregación GridFS Prácticas

Slide 10

Slide 10 text

La problemática de los datos Estructurados VS. No estructurados

Slide 11

Slide 11 text

La problemática de los datos Cambio de modelo Company vs User generated content Leer reviews Preguntar a amigos Ver tráiler Comprar entradas Publicar en RRSS Ver camino más rápido Comentar impresiones Subir fotos Escribir reseñas

Slide 12

Slide 12 text

Tipos de datos Estructurados Bases de datos (RDBMS), ERPs, … Semi-estructurados Logs, GPS, registros de llamadas,… No estructurados Sensores, Social media, VoIP, …

Slide 13

Slide 13 text

¿Qué es el Big Data? Datos demasiado grandes para ser almacenados y procesados por una sola máquina

Slide 14

Slide 14 text

Las 3 Vs del Big Data1 Volumen Variedad Velocidad 1 Douglas, Laney. “3D Data Management: Controlling Data Volume, Velocity and Variety”. Gartner, 2001 2 Image from Alison Bolen’s blog. “Marketing optimization is a big data problem”

Slide 15

Slide 15 text

Volumen 1 Image from S.G. Edward and N. Sabharwal, Practical MongoDB, DOI 10.1007/978-1-4842-0647-8_1

Slide 16

Slide 16 text

Volumen 0.01€/GB 1€/GB

Slide 17

Slide 17 text

Variedad Tablas predefinidas DATOS ACTUALES Imágenes Audio Documentos Mediciones Coordenadas …

Slide 18

Slide 18 text

Variedad Ejemplo: Banca Lista de cuentas y tarjetas Transacciones Escaneos de cheques Llamadas al servicio de soporte Correos electrónicos …

Slide 19

Slide 19 text

Velocidad Los datos tienen que ser almacenados y procesados sea cual sea la velocidad a la que se generen Incluso > TB/día

Slide 20

Slide 20 text

Velocidad Ejemplo: Tienda online 5 minutos Almacenar y procesar todos los logs Mejor experiencia de usuario

Slide 21

Slide 21 text

Usos del Big Data Visibilidad Descubrimiento y análisis de la información Segmentación y personalización Soporte a la toma de decisiones Innovación

Slide 22

Slide 22 text

Retos del Big Data Políticas y procedimientos Acceso a los datos Tecnología

Slide 23

Slide 23 text

Sistemas heredados y Big Data Estructura de los datos Estructurar lo no estructurado Almacenamiento de los datos Escalabilidad vertical Procesamiento de los datos Tipos de datos

Slide 24

Slide 24 text

Tecnologías Big Data Procesamiento paralelo y distribuido Redes de alta velocidad Clustering y entornos grid Computación en la nube Software de fuentes abiertas

Slide 25

Slide 25 text

Tecnologías Big Data

Slide 26

Slide 26 text

Selección de tecnología Big Data Analítica vs. Operacional Analítica Operacional Latencia 1 min – 100 min 1 ms – 100 ms Concurrencia 1 - 10 1000 - 100,000 Tipo de acceso Lectura Lectura y escritura Consultas No selectivas Selectivas Ámbito de los datos Retrospectiva Operacional Usuario final Ingeniero de datos Cliente Tecnología MapReduce, MPP NoSQL

Slide 27

Slide 27 text

¿Qué es NoSQL? NoSQL abarca una amplia variedad de diferentes tecnologías de bases de datos que se han desarrollado en respuesta a las demandas que se presentan en la construcción de aplicaciones modernas

Slide 28

Slide 28 text

¿Qué es NoSQL? No (sólo) utilizan SQL como lenguaje de consultas Ausencia de esquema No soportan JOIN ACID no garantizado Escalan bien horizontalmente

Slide 29

Slide 29 text

Tipos de bases de datos NoSQL Clave/Valor Documentales Grafos Columnas

Slide 30

Slide 30 text

ACID Atomicidad (A) Todos o ninguno Consistencia (C) Todas las consultas ven el mismo dato Aislamiento (I) Una operación no puede afectar a otras Durabilidad (D) Si una operación se realiza, esta persistirá

Slide 31

Slide 31 text

Teorema CAP (de Brewer1,2) Un sistema de cómputo distribuido solamente puede garantizar como mucho dos de las siguientes propiedades: Consistencia (Consistency) Disponibilidad (Availability) Tolerancia al particionado (Partition tolerance) 1 Eric Brewer “Towards Robust Distributed Systems” (2000). 2 Gilbert, S., & Lynch, N. (2002). “Brewer's conjecture and the feasibility of consistent, available, partition-tolerant web services”. ACM SIGACT News, 33(2), 51-59.

Slide 32

Slide 32 text

Teorema CAP (de Brewer) Consistencia Tolerancia al particionado Disponibilidad CA CP AP

Slide 33

Slide 33 text

BASE Basically Available El sistema garantiza la disponibilidad (CAP) Soft state El estado del sistema puede cambiar a lo largo del tiempo, incluso sin entradas Eventual consistency El sistema será consistente con el tiempo, siempre y cuando no reciba una entrada La implementación puede variar para cada base de datos NoSQL

Slide 34

Slide 34 text

Ventajas de NoSQL Alta escalabilidad Diseñadas para escalar horizontalmente Gestión y administración Recuperación automática de fallos, datos distribuidos, modelos de datos más simples. Costes reducidos Diseñadas para trabajar en clústeres de servidores Modelos de datos flexibles Los cambios de modelo son fácilmente implementados

Slide 35

Slide 35 text

Desventajas de NoSQL Madurez Muchas en versión alfa Soporte Open source. Falta de soporte a nivel global Capacidad de consulta limitada Algunas consultas pueden implicar conocimientos de programación Administración Pocas herramientas de administración Expertise Encontrar a profesionales con experiencia es más complicado

Slide 36

Slide 36 text

Escalabilidad RDBMS Bloqueo de todas las tablas (Update) Modelo consistencia rígido Consecuencias: Mayor latencia Aplicación lenta Agravado por replicación blogID Name 1 Bla bla 2 Ble ble tagID tag 33 tag1 34 tag2 blogID tagID 1 33 2 33 2 34

Slide 37

Slide 37 text

Escalabilidad RDBMS: Soluciones Denormalización Relajar consistencia (dirty reads) blogID Name tag 1 Bla bla tag1 2 Ble ble tag1 2 Ble ble tag2 blogID Name 1 Bla bla 2 Ble ble tagID tag 33 tag1 34 tag2 blogID tagID 1 33 2 33 2 34

Slide 38

Slide 38 text

Escalabilidad NoSQL: MongoDB ¡No hay esquema! Bloqueo a nivel de documento Eventual consistency blogID Name 1 Bla bla 2 Ble ble tagID tag 33 tag1 34 tag2 blogID tagID 1 33 2 33 2 34

Slide 39

Slide 39 text

Consistencia Servidor único X = “abc” X = “xyz”

Slide 40

Slide 40 text

Consistencia Varios servidores Completa Dispara y corre Mayoría X = “abc” X = “abc” X = “abc” X = “xyz” X = “xyz” X = “xyz”

Slide 41

Slide 41 text

Resumen Big Data Problemática de los datos Las 3Vs del Big Data Usos, retos y tecnologías NoSQL RDBMS vs. NoSQL Tipos Ventajas y Desventajas

Slide 42

Slide 42 text

¿Qué es MongoDB? Base de datos NoSQL orientada a documentos (open source) MongoDB viene del inglés “humongous” Sin esquema, no ACID, no JOINs, sin claves externas,… Almacena los datos en documentos BSON (Binary JSON) Diseñada para escalabilidad, rendimiento, alta disponibilidad

Slide 43

Slide 43 text

Un poquito de historia… 2007: Dwight Merriman y Eliot Horowitz quisieron desarrollar un servicio online. Plataforma para el desarrollo y hosting de aplicaciones web auto-escalable (GAE o MA) “We felt like a lot of existing databases didn’t really have the ‘cloud computing’ principles you want them to have: elasticity, scalability, and … easy administration, but also ease of use for developers and operators,” Merriman said. “[MySQL] doesn’t have all those properties.”1 1 The Register, Cade Metz, “MongoDB daddy: My baby beats Google BigTable”, May 25, 2011.

Slide 44

Slide 44 text

Un poquito de historia… 2008: Servicio finalizado. Nunca online 2009: Liberaron el código de la base de datos como MongoDB 2010: MongoDB 1.4.0 (production-ready) 2015: MongoDB 3.0 2015: MongoDB 3.2 (WiredTiger)

Slide 45

Slide 45 text

Rendimiento vs. Funcionalidad Almacena los datos en documentos NO soporta JOINs NO soporta transacciones (estilo RDBMS) Soporte a índices secundarios Consultas con documentos Atomicidad a nivel de documento Replica set: replicación maestro-esclavo con recuperación automática de fallos Escalabilidad horizontal Escrita en C++: Portabilidad

Slide 46

Slide 46 text

El modelo de datos “MongoDB se ha diseñado para trabajar con documentos sin necesidad de columnas predefinidas o tipos de datos (a diferencia de las bases de datos relacionales), por lo que el modelo de datos es extremadamente flexible1” 1 S.G. Edward and N. Sabharwal, Practical MongoDB, DOI 10.1007/978-1-4842-0647-8_1

Slide 47

Slide 47 text

El modelo de datos { "_id" : 1, "Calle" : "Sola", "Número": "1" } { "_id" : 2, "Calle" : "Colón" , "Número" : "22", "Portal": "B", "Piso": "5", "Puerta": "C" }

Slide 48

Slide 48 text

JSON JavaScript Object Notation Estándar1 de intercambio de datos en la web Alternativa a XML Human y Machine readable Soporta los tipos básicos: Cadenas, números, booleanos, arrays,… Bueno para almacenar datos Almacena toda la información relacionada en una sola estructura 1 RFC 4627, RFC 5179 y ECMA-404

Slide 49

Slide 49 text

JSON Ejemplo { "_id":1, "name":{ "first":"John", "last":"Doe" }, "publications":[ { "title":"First Book", "year":1989, "publisher":"publisher1" }, { "title":"Second Book", "year":1999, "publisher":"publisher2" } ] }

Slide 50

Slide 50 text

BSON Binary JavaScript Object Notation http://bsonspec.org Mecanismo de serialización muy eficiente Ligero Fácil navegación Eficiente Permite a MongoDB procesar los objetos para construir índices y emparejar objetos partiendo de consultas, tanto para claves de primer nivel como embebidas

Slide 51

Slide 51 text

BSON Ejemplo1: 1 Captura de BSONSpec.org (http://bsonspec.org)

Slide 52

Slide 52 text

Identificador (_id) Identificador único para recuperar documentos Siempre existe un campo _id Cadena Número (entero o flotante) Fecha (UCT) Objetos complejos NO arrays Si no se proporciona MongoDB asigna uno ObjectId

Slide 53

Slide 53 text

Capped collections Los documentos se almacenan en orden de inserción No es necesario un índice (consultas) Tamaño limitado Eliminación según FIFO (First in, first out) No se pueden borrar elementos Si actualizamos un documento con otro de mayor tamaño à Error Caso de uso Gestión de logs

Slide 54

Slide 54 text

Esquema polimórfico MongoDB es “sin esquema” ¿Almacenaríamos todos los objetos en una colección? Esquema polimórfico: Los documentos de una colección son similares, pero no idénticos Casos de uso: Programación orientada a objetos Actualizaciones del esquema en el tiempo

Slide 55

Slide 55 text

Resumen ¿Qué es MongoDB? Historia Rendimiento vs. Funcionalidad Modelo de datos JSON y BSON Identificadores Capped collections Esquema polimórfico

Slide 56

Slide 56 text

Instalación Descarga: https://www.mongodb.org/downloads Última versión: 3.2.1 Versiones de 32 y 64 bits Versión de 32 bits limitada a 2GB de datos Instalación: Linux : Ubuntu (https://goo.gl/0pJG5G), RedHat (https://goo.gl/U56FsT) Windows: https://goo.gl/0myHWp MacOS X: https://goo.gl/s7k7Zq Prerrequisitos: Directorio /data/db* creado y con permisos R/W * C:\data\db en Windows

Slide 57

Slide 57 text

MongoDB en CETA-IAAS Login: Usuario: root y password: Juc2016 Máquinas: juc01-juc15 Preinstalado: Mongo 3.2.1 Python 2.7.5

Slide 58

Slide 58 text

MongoD mongod: Demonio primario de MongoDB Gestiona peticiones, maneja el formato de los datos y ejecuta operaciones de mantenimiento Por defecto Escucha en el puerto 27017 Utiliza el directorio /data/db (C:\data\db en Windows) Interfaz web en 28017 (http://localhost:28017) Problemas comunes: Si no tiene permisos de R/W a /data/db Si no puede usar el puerto 27017

Slide 59

Slide 59 text

Mongo mongo: Shell de MongoDB Interfaz interactiva por línea de comandos para… Desarrolladores: Lanzar consultas y ejecutar comandos Administradores: Gestionar la base de datos Al inicio se conecta a la base de datos: test Variable global db referencia a la bbdd en uso

Slide 60

Slide 60 text

MongoS mongos: Utilizado en el sharding Servicio de routing que procesa las consultas y determina en qué nodo del clúster se localizan los datos solicitados

Slide 61

Slide 61 text

MongoDB Tools mongodump: Exporta el contenido de la base de datos a un fichero binario mongorestore: Permite importar el fichero de mongodump a una base de datos bsondump: Convierte contenido BSON en JSON o CSV mongoimport, mongoexport: permiten importar y exportar datos en una instancia JSON, CSV y TSV mongotop, mongostat, mongosniff: Proporcionan información de diagnóstico relacionada con la operación actual

Slide 62

Slide 62 text

El Shell de MongoDB Dos modos: Interactivo No interactivo mongo server/admin --eval “db.runCommand({ logRotate: 1 })” mongo localhost myScript.js mongo localhost myScript.js --shell

Slide 63

Slide 63 text

El Shell de MongoDB Ejemplo: Activar rotación de log con –eval mongo localhost/admin --eval “db.runCommand({ logRotate: 1 })” Ayuda: Usar para printjson para ver la salida Solución: mongo localhost/admin --eval “printjson(db.runCommand({ logRotate: 1 }))” Salida: { “ok”: 1 }

Slide 64

Slide 64 text

El Shell de MongoDB Ejemplo: Ejecutar script desde línea de comandos var userCount = function() { var count = db.Users.count(); var entry = { "_id": Date(), n: count }; db.UserCountHistory.save(entry); print("\nToday's User count: " + entry.n); }; userCount();

Slide 65

Slide 65 text

El Shell de MongoDB Ejemplo: Ejecutar script desde línea de comandos y entrar en el shell DB.prototype.dropDatabase = function() { print("Don't do it man!"); } db.dropDatabase = DB.prototype.dropDatabase();

Slide 66

Slide 66 text

El Shell de MongoDB Atajos de teclado Combinación de teclas Función [ß][à] Mover cursor izquierda/derecha [Ctrl] + [ß], [Ctrl] + [à] Mover cursor izquierda/derecha [][] Histórico de comandos [Home] o [Ctrl] + [a] Ir al comienzo de línea [End] o [Ctrl] + [e] Ir al final del línea [Ctrl] + [k] Borrado hasta el final de línea [Ctrl] + [l] Limpiar la pantalla

Slide 67

Slide 67 text

El Shell de MongoDB Editor externo Recomendado para scripts complejos Configurable por variables de entorno Windows: c:\> set EDITOR=“myExternalEditor.exe” Linux / OSX: export EDITOR=“myExternalEditor” mongo> myFunction = function(x) {} mongo> edit myFunction

Slide 68

Slide 68 text

El Shell de MongoDB Fichero .mongorc.js El contenido se carga al inicio del shell MongoDB lo busca en el HOME del usuario Ejecutando el shell con --norc no lo carga

Slide 69

Slide 69 text

El Shell de MongoDB Prevenir desastres: // Sample .mongorc.js file var _no_ = function(){ print("Nope!"); }; DB.prototype.dropDatabase = _no_; db.dropDatabase = db.prototype.dropDatabase; DB.prototype.shutdownServer = _no_; db.shutdownServer = db.prototype.shutdownServer;

Slide 70

Slide 70 text

Resumen Instalación de MongoDB Contenido de la instalación El shell de MongoDB: Uso: Interactivo vs Comando Información de utilidad: Tips y atajos de teclado

Slide 71

Slide 71 text

Operaciones CRUD CRUD: Create, Read, Update y Delete Almacenar datos en MongoDB Consultar de datos en MongoDB Uso de índices Otras operaciones

Slide 72

Slide 72 text

Almacenar datos insert: Inserta un documento en una colección db.products.insert( { item: "card", qty: 15 } ) save: Inserta o actualiza un documento db.products.save( { item: "book", qty: 40 } ) Se pueden insertar documentos usando un bucle: for(var i=1; i<=20; i++) db.products.insert({"item" : "item" + i, "qty" : i})

Slide 73

Slide 73 text

Almacenar datos update: Actualiza un documento query: documento a actualizar update: cambios a realizar options: número de documentos a actualizar, upsert,… Por defecto: Solo se actualiza uno y no se inserta si no existe db.products.update({ item : "card" }, { $set: { "qty" : 10 }}) db.products.update({ item : "card" }, { $inc: { "qty" : 1 }})

Slide 74

Slide 74 text

Almacenar datos $set: Reemplaza el valor de un campo $unset: Elimina un campo de un documento $rename: Actualiza el nombre de un campo $push: Añade un nuevo elemento a un array $addToSet: Añade un nuevo elemento a un array (si no existe ya) $pull: Elimina los elementos de un array que cumplen una determinada condición $pop: Elimina el primer o último elemento de un array

Slide 75

Slide 75 text

Almacenar datos findAndModify: Modifica y devuelve un solo documento db.foo.findAndModify({ query: , update: , upsert: , sort: , new: , sort: , fields: })

Slide 76

Slide 76 text

Almacenar datos remove: Elimina los documentos que cumplen una condición. Si no se especifica la condición, se borran todos. db.products.remove({ "item": "book" }) db.products.remove({})

Slide 77

Slide 77 text

Ejercicios 1. Entrar en el shell y cambiar a la base de datos “demo”. 2. Crear un documento vacío con el _id=1 en la colección “foo”. Mostrar el documento. 3. Añadir un campo “n” al documento creado anteriormente y asignarle un valor de 12. Mostrar el documento.

Slide 78

Slide 78 text

Ejercicios 4. Sumar 4 al campo “n” de los documentos cuyo valor sea menor que 16. Ejecutarlo varias veces. Mostrar el documento. 5. Añadir un campo array llamado “tags” al documento. Añadir el elemento “a” a dicho campo. Mostrar el documento. 6. Añadir los elementos “b” y “c” al array “tags”, pero asegurándote que la ejecución repetida del comando solo los insertará una vez.

Slide 79

Slide 79 text

Ejercicios 7. Añadir 9 documentos adicionales con ids que van del 2 al 10. Usar un bucle for de JavaScript. 8. Añadir un campo “early” a todos los documentos con _id <= 5 y asignarle el valor true. Deberás actualizar varios registros a la vez. 9. Eliminar el array del documento con id=1 con findAndModify(). Devolver el documento modificado.

Slide 80

Slide 80 text

Encontrar documentos find: Recupera documentos de una colección query: Criterio de selección. projection: Campos a recuperar db.products.find({}) db.products.find({ "item": "book" }, { "qty": 1 })

Slide 81

Slide 81 text

Encontrar documentos Comparación: $gt, $lt, $gte, $lte db.products.find({ _id: { $gt: 2, $lt: 5 } }) db.products.find({ _id: { $gte: 5 } }, { _id: 1 }) $not db.products.find({ _id: { $not: { $gte: 5 } } }) $in db.products.find({ _id: { $in: [1, 3] } }, { _id: 1 }) $nin db.products.find({ _id: { $nin: [1, 3] } }, { _id: 1 })

Slide 82

Slide 82 text

Encontrar documentos Comparación en arrays: Case sensitive db.animals.find({ tags: 'cute' }, { name: 1 }) db.animals.find({ Tags: 'cute' }, { name: 1 }) // Nope db.animals.find({ tags: ’Cute' }, { name: 1 }) // Nope $in db.animals.find({ tags: { $in: ['cute', 'ocean'] } }) $all db.animals.find({ tags: { $all: ['cute', 'ocean'] } }) $nin db.animals.find({ tags: { $nin: ['cute', 'ocean'] } })

Slide 83

Slide 83 text

Encontrar documentos Documentos embebidos: Se utiliza la notación “.” db.animals.find({ "info.canFly": true }) Utilizar con cuidado { _id: 1, name: 'duck', info: { type: "bird", "canFly": true } } // Devuelve resultados db.animals.find({ info: { type: "bird", "canFly": true } }) // NO Devuelve resultados db.animals.find({ info: { "canFly": true, type: "bird" } }) // NO Devuelve resultados db.animals.find({ info: { type: "bird" } }) // Devuelve resultados db.animals.find({ "info.canFly": true, "info.type": "bird" })

Slide 84

Slide 84 text

Encontrar documentos Documentos embebidos: null: Devuelve documentos con el campo a null y los que no lo tienen db.animals.find({ "info.canFly": null }) $exists: Devuelve documentos que tengan ese campo db.animals.find({ "info.canFly": { $exists: true } })

Slide 85

Slide 85 text

Encontrar documentos Proyecciones: Se indica con un 1 los campos que se quieren recuperar y un 0 los que no db.animals.find({ _id: 1 }, { _id: 1 }) Si no se especifica lo contrario, el _id siempre se devuelve db.animals.find({ _id: 1 }, { name: 1 }) No es posible mezclar campos a incluir y a excluir (excepto para el _id) // Ok db.animals.find({ _id: 1 }, { _id: 0, name: 1 }) // Error db.animals.find({ _id: 1 }, { _id: 0, name: 1, info: 0 })

Slide 86

Slide 86 text

Encontrar documentos Cursor: Objeto devuelto por una operación de búsqueda con find Operaciones: size: Devuelve el número de elementos del cursor. hasNext: Devuelve true si hay más elementos. forEach: Aplica una función sobre los elementos del cursor. sort: Permite ordenar los resultados. Positivo ascendente y negativo descendente. limit: Limita el número de resultados devueltos. skip: Permite saltar los primeros resultados de una consulta. db.animals.find({}).sort({_id: -1}).limit(10).skip(3)

Slide 87

Slide 87 text

Encontrar documentos findOne: Devuelve un solo resultado. No devuelve un cursor. Mismos parámetros que find: filtro y proyección db.animals.findOne({ _id: 1 }, { name: 1 })

Slide 88

Slide 88 text

Ejercicios 1. Cambiar a la base de datos "demo” 2. Insertar los siguientes documentos a la colección "animals” db.animals.save({ _id: 1, name: 'cat', tags:['land','cute'] ,info:{type:'mammal', color:'red' }}) db.animals.save({ _id: 2, name: 'rabbit', tags:['land','cute'],info:{type:'mammal', color:'white' } }) db.animals.save({ _id: 3, name: 'shark', tags:['ocean'] ,info:{type:'fish', color:'grey' }}) db.animals.save({ _id: 4, name: 'dolphin', tags:['ocean','cute'] ,info:{type:'mammal', color:'grey', canFly: null }}) db.animals.save({ _id: 5, name: 'penguin', tags:['land','ocean','cute'] ,info:{type:'bird', canFly:false }}) db.animals.save({ _id: 6, name: 'duck', tags:['land','cute'], info: {type:'bird', canFly: true} })

Slide 89

Slide 89 text

Ejercicios 3. Encontrar todos los animales con el tag "ocean” 4. Encontrar todos los animales de color gris "grey". Devolver solo su nombre 5. Encontrar todos los animales que pueden volar 6. Encontrar todos los animales que no tienen el campo 'info.canFly’ 7. Encontrar todos los animales que tengan el campo "info.canFly" a null o que no lo tengan 8. Encontrar todos los documentos, ordenados por _id de manera descendente. Devolver el _id solo 9. Repetir la última consulta, pero esta vez devolver solo el segundo y tercer documento

Slide 90

Slide 90 text

Ejercicios 10. El método del cursor forEach() toma una función con un solo parámetro representando cada documento. Obtener los nombres de todos los animales Almacenarlos en un array en el shell Ayuda: Los arrays en JavaScript tienen el método push() Por ejemplo: db.animals.find({}).forEach(function(r){ print(r._id)})

Slide 91

Slide 91 text

Índices Los índices son estructuras de datos que permiten acelerar las operaciones de lectura que se usan con frecuencia Por defecto, cuando se crea una colección y se añaden documentos a ésta, se crea un índice sobre el campo _id Ejemplo: Insertar 1.000.000 de documentos en una colección con un bucle JavaScript for (i = 0; i < 1000000; i++) { db.testindx.insert({ "name": "user" + i, "age": Math.floor(Math.random() * 120) }) }

Slide 92

Slide 92 text

Índices explain: Función que puede ser utilizada para conocer los pasos llevado a cabo por MongoDB en la ejecución de una consulta Tipos de salida: queryPlanner: Por defecto. Contiene información sobre la selección del plan de ejecución de consultas. executionStats: Incluye información detallada del plan ganador. allPlansExecution: Presenta información parcial de la ejecución de todos los planes de ejecución evaluados.

Slide 93

Slide 93 text

Índices explain: Etapas que describen la operación: COLSCAN: Se procesa toda la colección. IXSCAN: Se procesan las entradas de un índice. FETCH: Se recuperan documentos. SHARD_MERGE: Se fusionan resultados de los shards. Ejercicio: Averiguar el número de documentos examinados al ejecutar la consulta: db.testindx.find({ "name": "user100" }); Ayuda: Ejecutar explain a nivel de colección

Slide 94

Slide 94 text

Índices Índice de un solo campo db.testindx.createIndex({ "name": 1 }) El valor positivo o negativo indica el orden (1 ascendente y -1 descendente) Ejercicio: Crear el índice sobre el campo “name” y ejecutar la consulta anterior. Consultar los valores de stage, totalDocsExamined y executionTimeMillis

Slide 95

Slide 95 text

Índices Índice compuesto El índice se compone de dos o más campos Se deben considerar si cubre la mayoría de las consultas Orden recomendado: igualdad, orden y rango Ejercicio: Crear el índice para optimizar la consulta db.testindx.find({ "name": "user100", "age": { $gt: 25 } });

Slide 96

Slide 96 text

Índices system.indexes Almacena toda la información sobre los índices de una base de datos Se crea automáticamente al crear una base de datos Colección reservada, solamente se puede manipular con: createIndex: Crea un índice sobre una colección dropIndexes: Borra todos los índices de una base de datos

Slide 97

Slide 97 text

Índices Otras operaciones: getIndexes: Sobre una colección, devuelve todos los índices de esa colección. dropIndex: Elimina un índice sobre una colección. reIndex: Reconstruye los índices de una colección. Consiste en borrar todos los índices y volverlos a crear.

Slide 98

Slide 98 text

Índices Cómo funcionan los índices… MongoDB almacena los índices en una estructura de árbol B+, por lo que las consultas por rango se soportan automáticamente. La primera vez… MongoDB crea varios planes de ejecución para cada índice disponible y espera a que el más rápido termine. La segunda vez… Se utiliza el índice ganador de la primera hasta que un cierto número de actualizaciones se ejecutan sobre la colección

Slide 99

Slide 99 text

Otros tipos de índices Índices dispersos: contiene todas los documentos de la colección que poseen el campo sobre el que se creó el índice Ejemplo: Para el siguiente índice disperso db.users.createIndex({ "LastName": 1}, { sparse: true }) contendrá… { "FirstName": "John", "LastName": "Doe" } { "FirstName": "John", "LastName": null } pero no contendrá… { "FirstName": "John" }

Slide 100

Slide 100 text

Otros tipos de índices Índices TTL: elimina los documentos de la colección después del período especificado Índice geoespacial: permite encontrar documentos que estén “cerca” de una localización Índice geoHaystack: índice geoespacial optimizado para áreas pequeñas. Indicados para filtrar adicionalmente por otra dimensión Índice de texto: Permite búsquedas sobre texto.

Slide 101

Slide 101 text

Limitaciones de los índices1 No se permiten más de 64 índices por colección Las claves de los índices no pueden superar los 1024 bytes Un documento no puede ser indexado si los valores de su clave son más grandes que su tamaño El nombre de un índice no puede superar los 128 caracteres (inc. namespace) … 1 Enlace a la documentación de MongoDB: “Limitaciones de los índices”

Slide 102

Slide 102 text

Otras operaciones Utilizadas para realizar agregados MapReduce: Permite la ejecución de tareas en un clúster reduciendo el tiempo de cálculo. Pensado para procesamiento en batch. aggregate(): Permite el cálculo de agregados sin necesidad de utilizar MapReduce. Más rápido Pensado para procesamiento en tiempo real.

Slide 103

Slide 103 text

MapReduce Etapas: Map: El nodo máster toma la entrada y divide en subtareas que envía a los workers. Éstos pueden dividir en nuevas subtareas. Una vez completada se devuelven los resultados al máster. Reduce: El nodo máster combina las respuestas recibidas y produce la salida final

Slide 104

Slide 104 text

MapReduce1 1 Imagen de la documentación oficial de MongoDB: “Map-Reduce”

Slide 105

Slide 105 text

Aggregate()1 1 Imagen de la documentación oficial de MongoDB: “Aggregation pipeline”

Slide 106

Slide 106 text

Resumen Cómo almacenar datos en MongoDB Cómo consultar datos en MongoDB Uso de los índices Otras operaciones: MapReduce aggregate()

Slide 107

Slide 107 text

Recomendaciones Decisiones al modelar los datos Embeber o Referenciar Consideraciones operacionales

Slide 108

Slide 108 text

Embeber vs. Referenciar Embeber: Útil cuando se consulta información relacionada para presentarla en pantalla. Ejemplo: Blog Beneficios: Toda la información se obtiene en una sola búsqueda Atomicidad y aislamiento al escribir datos Desventajas: Menor flexibilidad en las consultas (Ejemplo: recuperar comentarios de un usuario del blog)

Slide 109

Slide 109 text

Embeber vs. Referenciar Referenciar: Útil cuando cuando la información se consulta de varias maneras o en relaciones *-to-many. Beneficios: Mejor rendimiento de lectura (respecto a documentos grandes embebidos) Mejor rendimiento en escritura (menos probabilidad de reubicar el documento) Desventajas: Atomicidad y aislamiento Recuperación de información relacionada

Slide 110

Slide 110 text

Consideraciones operacionales Gestión del ciclo de vida: Considerar el uso de TTL si los datos caducan. Considerar capped collections si solo se trabaja con los últimos documentos insertados. Índices: El uso de índices para consultas mejora el rendimiento de la aplicación. Para escrituras en masa, tiene un impacto negativo (hay que añadir las claves al índice). Sharding: El particionamiento de datos puede incrementar el rendimiento de la aplicación.

Slide 111

Slide 111 text

Consideraciones operacionales Número de colecciones: No hay penalización de rendimiento si la base de datos tiene más o menos colecciones. Tener varias colecciones para diferentes tipos de datos puede ser beneficioso en procesos batch. Hay que tener en cuenta: MongoDB añade un pequeño overhead (KBs) para cada colección. Al menos 8KB de espacio se necesitan para cada índice. Tamaño de los documentos: Las operaciones de escritura pueden provocar que la reubicación del documento, lo que penaliza en el rendimiento de la aplicación.

Slide 112

Slide 112 text

GridFS Especificación para almacenar y recuperar ficheros que exceden el tamaño máximo de documento BSON (16 MB) Los ficheros se dividen en fragmentos de 255 KB (excepto el último) GridFS usa dos colecciones: files: Almacena los metadatos chunks: Almacena los fragmentos ¡Es necesario un driver de Mongo!

Slide 113

Slide 113 text

La colección chunks Cada documento representa un fragmento de un fichero Campos: _id: Identificador único del documento files_id: _id del documento padre (files) n: Número de secuencia del fragmento (comienza en 0) data: Contenido binario del fragmento

Slide 114

Slide 114 text

La colección files Cada documento representa un fichero Campos: _id: Identificador único del documento length: Longitud en bytes del documento chunkSize: Tamaño de cada fragmento (bytes) uploadDate: Fecha de subida del documento md5: Cadena con el hash MD5 Opcionales: filename, contentType, aliases, metadata,…

Slide 115

Slide 115 text

Índices Los drivers que siguen la especificación crean dos índices para la recuperación eficiente de los ficheros: chunks: Compuesto por file_id y n files: Compuesto por filename y uploadDate Si no existen, se pueden crear desde el shell: db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } ); db.fs.files.createIndex( { filename: 1, uploadDate: 1 } );

Slide 116

Slide 116 text

¿Cuándo usar GridFS? Siempre que el tamaño del documento sea mayor a 16 MB (si es menor, usar BinData) En algunos casos, en sustitución de un sistema de ficheros: Si existe un límite de ficheros por directorio Si se desea mantener los ficheros automáticamente sincronizados y replicados Cuando se quiere acceder a ficheros sin cargarlos completamente en memoria No actualizar el fichero por completo (update) Mejor insertarlo como nuevo y usar el campo metadata

Slide 117

Slide 117 text

Ejercicio Subir un fichero con PyMongo Consultar las colecciones fs.files y fs.chunks Leer el fichero subido y mostrarlo por pantalla Ayuda: Instalación de PyMongo: pip install pymongo Ejemplos documentación PyMongo: http://api.mongodb.org/python/current/examples/gridfs.html

Slide 118

Slide 118 text

¡Gracias por vuestra atención! ¿Preguntas? [email protected] y [email protected]