Pro Yearly is on sale from $80 to $50! »

JUC2016 - Mongo 101

C4187f9cd1f03aa1619b269218883910?s=47 CETA-Ciemat
February 09, 2016

JUC2016 - Mongo 101

II Jornadas Técnicas UEx – CIEMAT. Mongo 101
En esta presentación se presenta la tecnología NoSQL y el sistema gestor de bases de datos MongoDB

C4187f9cd1f03aa1619b269218883910?s=128

CETA-Ciemat

February 09, 2016
Tweet

Transcript

  1. 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
  2. @josemi_fv josemiguel.franco@ciemat.es josemifv

  3. @tharandur cesar.suarez@externos.ciemat.es csuarez

  4. 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
  5. None
  6. 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)
  7. 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
  8. CIEMAT

  9. Contenido Introducción e instalación básica Operaciones CRUD Modelado de datos

    Rendimiento y agregación GridFS Prácticas
  10. La problemática de los datos Estructurados VS. No estructurados

  11. 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
  12. Tipos de datos Estructurados Bases de datos (RDBMS), ERPs, …

    Semi-estructurados Logs, GPS, registros de llamadas,… No estructurados Sensores, Social media, VoIP, …
  13. ¿Qué es el Big Data? Datos demasiado grandes para ser

    almacenados y procesados por una sola máquina
  14. 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”
  15. Volumen 1 Image from S.G. Edward and N. Sabharwal, Practical

    MongoDB, DOI 10.1007/978-1-4842-0647-8_1
  16. Volumen 0.01€/GB 1€/GB

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

  18. Variedad Ejemplo: Banca Lista de cuentas y tarjetas Transacciones Escaneos

    de cheques Llamadas al servicio de soporte Correos electrónicos …
  19. Velocidad Los datos tienen que ser almacenados y procesados sea

    cual sea la velocidad a la que se generen Incluso > TB/día
  20. Velocidad Ejemplo: Tienda online 5 minutos Almacenar y procesar todos

    los logs Mejor experiencia de usuario
  21. 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
  22. Retos del Big Data Políticas y procedimientos Acceso a los

    datos Tecnología
  23. 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
  24. 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
  25. Tecnologías Big Data

  26. 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
  27. ¿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
  28. ¿Qué es NoSQL? No (sólo) utilizan SQL como lenguaje de

    consultas Ausencia de esquema No soportan JOIN ACID no garantizado Escalan bien horizontalmente
  29. Tipos de bases de datos NoSQL Clave/Valor Documentales Grafos Columnas

  30. 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á
  31. 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.
  32. Teorema CAP (de Brewer) Consistencia Tolerancia al particionado Disponibilidad CA

    CP AP
  33. 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
  34. 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
  35. 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
  36. 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
  37. 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
  38. 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
  39. Consistencia Servidor único X = “abc” X = “xyz”

  40. Consistencia Varios servidores Completa Dispara y corre Mayoría X =

    “abc” X = “abc” X = “abc” X = “xyz” X = “xyz” X = “xyz”
  41. 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
  42. ¿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
  43. 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.
  44. 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)
  45. 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
  46. 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
  47. 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" }
  48. 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
  49. JSON Ejemplo { "_id":1, "name":{ "first":"John", "last":"Doe" }, "publications":[ {

    "title":"First Book", "year":1989, "publisher":"publisher1" }, { "title":"Second Book", "year":1999, "publisher":"publisher2" } ] }
  50. 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
  51. BSON Ejemplo1: 1 Captura de BSONSpec.org (http://bsonspec.org)

  52. 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
  53. 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
  54. 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
  55. Resumen ¿Qué es MongoDB? Historia Rendimiento vs. Funcionalidad Modelo de

    datos JSON y BSON Identificadores Capped collections Esquema polimórfico
  56. 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
  57. MongoDB en CETA-IAAS Login: <IP externa asignada> Usuario: root y

    password: Juc2016 Máquinas: juc01-juc15 Preinstalado: Mongo 3.2.1 Python 2.7.5
  58. 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
  59. 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
  60. 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
  61. 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
  62. 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
  63. 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 }
  64. 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();
  65. 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();
  66. 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
  67. 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
  68. 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
  69. 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;
  70. 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
  71. Operaciones CRUD CRUD: Create, Read, Update y Delete Almacenar datos

    en MongoDB Consultar de datos en MongoDB Uso de índices Otras operaciones
  72. 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})
  73. 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 }})
  74. 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
  75. Almacenar datos findAndModify: Modifica y devuelve un solo documento db.foo.findAndModify({

    query: <document>, update: <document>, upsert: <boolean>, sort: <document>, new: <boolean>, sort: <document>, fields: <document> })
  76. 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({})
  77. 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.
  78. 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.
  79. 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.
  80. 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 })
  81. 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 })
  82. 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'] } })
  83. 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" })
  84. 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 } })
  85. 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 })
  86. 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)
  87. 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 })
  88. 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} })
  89. 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
  90. 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)})
  91. Í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) }) }
  92. Í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.
  93. Í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
  94. Í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
  95. Í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 } });
  96. Í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
  97. Í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.
  98. Í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
  99. 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" }
  100. 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.
  101. 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”
  102. 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.
  103. 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
  104. MapReduce1 1 Imagen de la documentación oficial de MongoDB: “Map-Reduce”

  105. Aggregate()1 1 Imagen de la documentación oficial de MongoDB: “Aggregation

    pipeline”
  106. Resumen Cómo almacenar datos en MongoDB Cómo consultar datos en

    MongoDB Uso de los índices Otras operaciones: MapReduce aggregate()
  107. Recomendaciones Decisiones al modelar los datos Embeber o Referenciar Consideraciones

    operacionales
  108. 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)
  109. 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
  110. 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.
  111. 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.
  112. 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!
  113. 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
  114. 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,…
  115. Í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 } );
  116. ¿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
  117. 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
  118. ¡Gracias por vuestra atención! ¿Preguntas? josemiguel.franco@ciemat.es y cesar.suarez@externos.ciemat.es