$30 off During Our Annual Pro Sale. View Details »

JUC2016 - Mongo 101

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

CETA-Ciemat

February 09, 2016
Tweet

More Decks by CETA-Ciemat

Other Decks in Technology

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

    View Slide

  2. @josemi_fv
    [email protected]
    josemifv

    View Slide

  3. @tharandur
    [email protected]
    csuarez

    View Slide

  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

    View Slide

  5. View Slide

  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)

    View Slide

  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

    View Slide

  8. CIEMAT

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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”

    View Slide

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

    View Slide

  16. Volumen
    0.01€/GB 1€/GB

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  25. Tecnologías Big Data

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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á

    View Slide

  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.

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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.

    View Slide

  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)

    View Slide

  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

    View Slide

  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

    View Slide

  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" }

    View Slide

  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

    View Slide

  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"
    }
    ]
    }

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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 }

    View Slide

  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();

    View Slide

  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();

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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;

    View Slide

  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

    View Slide

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

    View Slide

  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})

    View Slide

  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 }})

    View Slide

  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

    View Slide

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

    View Slide

  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({})

    View Slide

  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.

    View Slide

  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.

    View Slide

  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.

    View Slide

  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 })

    View Slide

  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 })

    View Slide

  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'] } })

    View Slide

  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" })

    View Slide

  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 } })

    View Slide

  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 })

    View Slide

  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)

    View Slide

  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 })

    View Slide

  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} })

    View Slide

  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

    View Slide

  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)})

    View Slide

  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)
    })
    }

    View Slide

  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.

    View Slide

  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

    View Slide

  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

    View Slide

  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 } });

    View Slide

  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

    View Slide

  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.

    View Slide

  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

    View Slide

  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" }

    View Slide

  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.

    View Slide

  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”

    View Slide

  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.

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  107. Recomendaciones
    Decisiones al modelar los datos
    Embeber o Referenciar
    Consideraciones operacionales

    View Slide

  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)

    View Slide

  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

    View Slide

  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.

    View Slide

  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.

    View Slide

  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!

    View Slide

  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

    View Slide

  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,…

    View Slide

  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 } );

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide