Este documento presenta una introducción al modelo de datos NoSQL y MongoDB. Explica que MongoDB usa un modelo de datos de documentos donde cada documento se almacena como un objeto JSON. También describe los patrones comunes de modelado de datos y relaciones, y las operaciones y consultas básicas en MongoDB como CRUD y los diferentes tipos de índices. Finalmente, brinda una visión general de la arquitectura y réplica de MongoDB.
3. Modelo de datos
Un documento auto descrito que puede estar en
formato Json o XML
Un documento Json (los mas usados)
◦ Es un conjunto de clave:valor o arreglos de clave:valor
◦ Los documentos están almacenados por una clave
◦ El sistema entiende la estructura arbitraria de los documentos
◦ Da soporte a listas, apuntadores a documentos y documentos anidados
◦ Permite crear índices secundarios además de índices sobre la clave
5. Modelo de datos - Estructuras
Base de
datos
•Contenedor físico de
colecciones o
documentos
Colecciones
•Agrupaciones de
documentos, no
todas las BD lo
tienen
Documento •Unidad básica de
datos en Json
Valores
•Atómicos
•Listas o arreglos
•Adjuntos (pdf, jpg, etc)
5
6. Caso de Estudio – Tipos de datos
6
Los definidos por Json
•String - Cadenas de caracteres.
•Integer - Números enteros.
•Double - Números con decimales.
•Boolean - Booleanos verdaderos o falsos.
•Date - Fechas.
•Timestamp - Marcas de tiempo.
•Null - Valor nulo.
•Array - Arreglos de otros tipos de dato.
•Object - Otros documentos embebidos.
•ObjectID - Identificadores únicos creados por MongoDB al
crear documentos sin especificar valores para el campo _id.
•Data Binaria - Punteros a archivos binarios.
•Javascript - código y funciones Javascript
7. Caso de Estudio – Patrones de
modelado
7
Existen 2 patrones principales para establecer la
estructura que tendrán los documentos para
relacionar datos que en una base de datos relacional
estarían en diferentes tablas.
Embeber
◦ Este patrón se enfoca en incrustar documentos uno dentro
de otro con la finalidad de hacerlo parte del mismo registro
y que la relación sea directa.
Referenciar
◦ Este patrón busca imitar el comportamiento de las claves
foráneas para relacionar datos que deben estar en
colecciones diferentes.
8. Caso de Estudio – Patrones de
modelado
8
Embeber
Persona= {
Nombre: 'Jonathan',
Apellido: 'Wiesel',
Genero: 'M',
Documentos: {
Pasaporte: 'D123456V7',
Licencia: '34567651-2342',
seguro_social: 'V-543523452' }
}
Relaciones 1:1
15. Distribución de los datos
Sharding automático:
◦ Por rango de clave, con servidor de metadata que mantiene
la ubicación de los rangos
◦ Hashing consistente
16. Almacenamiento
Si cada nodo tiene un conjunto de claves aleatorias,
internamente puede almacenarse de distintas
maneras:
◦ Tabla hash
◦ arboles B+ (Tokyo Cabinet)
Tipos de registros
◦ <key, value>
◦ Tupla<key, v1,. ., vn>
17. Operaciones
CRUD
◦ Create: Crea un nuevo documento
◦ Read: Lee uno o mas documentos
◦ Update: Actualiza un documento nuevo
◦ Delete: Elimina uno o más documentos
REST
◦ GET: Retorna un documento con un id dado
◦ PUT: Crea un nuevo documento o una nueva versión
◦ DELETE: Marca un documento como borrado
Map - Reduce
17
18. Técnicas usadas - ejemplos
Problema MongoDB CouchDB
Topología Cluster (maestro esclavo) Anillo
Sharding
Particionamiento por rango,
particionamiento por hash y splitting
Hashing Consistente DHT
Control de concurrencia
Bloqueo compartido (S) para lectura
y Exclusivo (X) para escritura con
intentos de bloqueo (IS e IX)
MVCC y relojes de vector con
reconciliación durante lecturas
Manejo de fallas temporales
Servidor de configuración
Sloppy Quorum y hinted handoff
Manejo de fallas permanentes
Replica sets maestro esclavo con
elección de nuevo maestro cuando
se presentan fallas
Anti- entropía con árboles Merkle
para Consistencia de Replicas
Nodos salientes o entrantes Sharded Collection Balancing
Protocolo de membresía basado en
Gossip y detección de fallas.
Búsquedas
Árboles B+ para Índices por clave y
secundarios
Árboles B+ para Índices por clave y
secundarios
19. Caso de Estudio
19
Viene de la palabra en inglés “humongous” que significa
enorme
Su desarrollo empezó en octubre de 2007 por la
compañía de software 10gen, aunque su lanzamiento fue
en el 2009
Es de código abierto, con licencia GNU AGPL (para SW de
red)
Última versión estable 3.2.8 el 12 de Julio de 2016
Guarda estructuras de datos en documentos
tipo JSON con un esquema dinámico (MongoDB llama
ese formato BSON)
https://docs.mongodb.org
22. Caso de Estudio - Consultas
22
En MongoDB una consulta se dirige a una colección específica de
documentos .
Las consultas especifican criterios o condiciones , que identifican
los documentos que MongoDB vuelve a los clientes
Una consulta puede incluir una proyección que especifica los
campos de los documentos
Opcionalmente, se puede imponer límites o criterios de
ordenación a las consultas.
23. Caso de Estudio - Operadores
23
Selección
◦ Comparación
◦ Lógicos
◦ Elementos
◦ Otros
Proyección
https://docs.mongodb.org/manual/reference/operator/query/
24. Consultas – Operadores de
comparación
24
Operador Descripción
$eq Documentos que coinciden con los valores que son iguales a un valor especificado
$gt Documentos que coinciden con los valores que son mayores a un valor especificado
$gte Documentos que coinciden con los valores que son mayores o iguales a un valor
especificado
$lt Documentos que coinciden con los valores que son menores a un valor especificado
$lte Documentos que coinciden con los valores que son menores o iguales a un valor
especificado
$ne Documentos que coinciden con los valores que no son iguales a un valor especificado
$in Documentos que coinciden con alguno de los valores especificados en un arreglo
$nin Documentos que no coinciden con ninguno de los valores especificados en un arreglo
25. Consultas – Operadores lógicos
25
Operador Descripción
$or Une a las cláusulas con un OR lógico y devuelve todos los documentos que coinciden
con las condiciones de cualquiera de las cláusulas
$and Une a las cláusulas con un OR lógico y devuelve todos los documentos que coinciden
con las condiciones de ambas cláusulas
$not Invierte el efecto de una condición retornando los documentos que no cumplen con la
condición
$nor Une a las cláusulas con un NOR lógico y devuelve todos los documentos no cumplan
con ambas cláusulas.
26. Consultas – Operadores de
Elementos
26
Operador Descripción
$exists Coincide con los documentos que tienen o no el campo especificado, recibe el
parámetro true o false
db.records.find( { album: { $exists: true } } )
Documentos que tienen el campo álbum
db.records.find( { autor: { $exists: false } } )
Documentos que no contienen el campo autor
$type Selecciona documentos donde el field es de un tipo BSON específico.
{ field: { $type: <BSON type number> | <String alias> } }
27. Consultas – Operadores de
Proyección
27
Operador Descripción
$exists Coincide con los documentos que tienen o no el campo especificado, recibe el
parámetro true o false
db.records.find( { album: { $exists: true } } )
Documentos que tienen el campo álbum
db.records.find( { autor: { $exists: false } } )
Documentos que no contienen el campo autor
$type Selecciona documentos donde el field es de un tipo BSON específico.
{ field: { $type: <BSON type number> | <String alias> } }
29. Caso de estudio- Índices
Los índices en MongoDB son a nivel de colección y
son similares a los índices en otros sistemas de base
de datos
◦ Índices primarios para _id (clave primaria): se crean por
defecto
◦ Índices secundarios para atributos en el documento
◦ Un solo campo
◦ Múltiples campos
29
db.users.createIndex({ “score" : 1 })
30. Caso de estudio - Índices
Múltiples campos (Índices compuestos): hace
referencia a múltiples campos en una colección de
documentos
◦ db.events.createIndex( { "username" : 1, "date" : -1 } )
Este índice soporta las siguientes consultas
◦ db.events.find().sort( { username: 1, date: -1 } )
◦ db.events.find().sort( { username: -1, date: 1 } )
30
31. Caso de estudio Almacenamiento
Mongo tiene 3 motores de almacenamiento
◦ WiredTiger. Es el motor de almacenamiento por defecto
de MongoDB desde la versión 3.2. Provee control de
concurrencia a nivel de documento.
◦ MMAPv1 es el motor original de almacenamiento
MongoDB y es el motor de almacenamiento por defecto
para las versiones MongoDB antes 3.2. Se desempeña bien
en las cargas de trabajo con altos volúmenes de lectura y
escritura, así como actualizaciones en el lugar.
◦ El Motor de almacenamiento "In-Memory" solo está
disponible en MongoDB Enterprice. En lugar de almacenar
documentos en el disco, se les retiene en memoria el mayor
tiempo de latencia de datos posible.
31
32. Caso de Estudio – Arquitectura
32
mongod es el proceso demonio primario para el
sistema de MongoDB. Se ocupa de las solicitudes
de datos , gestiona el acceso de datos, y realiza
operaciones de gestión en background.
Mongos para " MongoDB Shard", es un servicio
de enrutamiento para las configuraciones de
fragmento MongoDB que procesa las consultas
de la capa de aplicación , y determina la ubicación
de los datos en el clúster fragmentado, con el fin
de completar estas operaciones.
Config Server Mongos utiliza tres servidores de
configuración para almacenar los metadatos del
cluster, y los tres deben estar disponibles para
apoyar cambios que incluyen divisiones de chunks
y migraciones . Si uno de los servidores de
configuración no está disponible debe
reemplazarlo a la brevedad posible .
33. Caso de estudio - Replicación
Un conjunto de replica
◦ Es un grupo de instancias de mongod que mantiene el
mismo conjunto de datos, donde el primario recibe las
actualizaciones de los clientes quien las replica a los
secudarios
33
34. Caso de estudio - Replicación
Fallo del primario
◦ Automaticamente se elige como primario a uno de los
secundarios
34
35. Caso de estudio - Replicación
Si el nodo se recupera
◦ Pasa a ser secundario
35
36. Caso de estudio - Sharding
Divide el conjunto de datos y distribuye los datos a
través de múltiples servidores o fragmentos .
◦ Cada fragmento es una base de datos independiente ,
◦ y colectivamente , los fragmentos forman una sola base de
datos lógica.
36
37. Caso de estudio - Sharding
37
Escalabilidad para escribir
Key Range
0..100
mongod
mongod mongod
Key Range
0..50
Key Range
51..100
38. Caso de estudio - Sharding
38
mongod mongod mongod mongod
Key Range
0..25
Key Range
26..50
Key Range
51..75
Key Range
76.. 100
Escalabilidad para escribir
39. Caso de estudio - Sharding
39
Primary
Secondary
Secondary
Primary
Secondary
Secondary
Primary
Secondary
Secondary
Primary
Secondary
Secondary
Key Range
0..25
Key Range
26..50
Key Range
51..75
Key Range
76.. 100
42. Caso de estudio - Splitting
42
Splitting o división es un proceso en background que
asegura que los datos almacenados no excedan un
tamaño específico Mongo divide los datos en trozos
(chunks). Cuando un trozo crece más allá de un
tamaño especificado, MongoDB lo divide por la
mitad y distribuye los trozos en un servidor de
fragmentos.
43. Caso de estudio - Splitting
43
GridFS: Especificación para almacenar y recuperar
archivos (documentos) que excedan el tamaño límite
de documento Bson de 16MB
◦ Divide el archivo en pedazos o chunks, por defecto de 255
KB
◦ Usa dos coleccciones para almacenar los datos
◦ En una se almacenan los chunks
◦ En otra se almacena la metadata
◦ https://docs.mongodb.org/manual/core/gridfs/
45. Caso de estudio - Seguridad
45
Para asignar un Rol a un usuario
db.grantRolesToUser(
"reportsUser",
[
{ role: "readWrite", db: "products" } ,
{ role: "readAnyDatabase", db:"admin" }
]
)
Tambien permite el uso de un proxy a través del protocolo
LDAP
47. Caso de estudio – Consultas
avanzadas
Consultas con arreglo de documentos:
◦ La siguiente operación devuelve documentos de la
colección bios donde un arreglo premios contiene un
elemento de documento incrustado que contiene el campo
premio igual al "Premio Turing" y el campo de año mayor a
1980:
db.bios.find(
{ awards: {
$elemMatch: {
award: "Turing Award",
year: { $gt: 1980 }
}
}
}
)
48. Caso de estudio – Consultas
avanzadas
Consultas con documentos embebidos
◦ La siguiente operación devuelve documentos de la
colección bios donde el documento embebido name es
exactamente { first: "Yukihiro", last: "Matsumoto" }
db.bios.find(
{
name: {
first: "Yukihiro",
last: "Matsumoto"
}
}
)
db.bios.find(
{
"name.first": "Yukihiro",
"name.last": "Matsumoto"
}
)
49. Caso de estudio – Consultas
avanzadas
Cursores:
◦ El método db.collection.find() consulta una colección y
retorna un cursor a los documentos resultantes
◦ Para acceder a los documentos se necesita iterar el cursor
var myCursor = db.inventory.find();
var myFirstDocument = myCursor.hasNext() ? myCursor.next() :
null;
myCursor.objsLeftInBatch();
http://docs.mongodb.org/manual/core/cursors/
50. Caso de estudio – Consultas
avanzadas
Agregación: operaciones que procesan registros de
datos y retornan resultados calculados
Posee tres formas de agregación
◦ Pipeline de agregación: framework para llevar a cabo
tareas de agregación. Modelado en el concepto de pipelines
de procesamiento de datos
◦ Map-Reduce: Operaciones con dos fasos Map y Reduce. Usa
funciones de Javascript
◦ Operaciones de agregación de propósito simple: comandos
de base de datos de propósito especial
51. Caso de estudio – Consultas
avanzadas
Pipeline de agregación: Es una serie de transformación de
Documentos
◦ Se ejecuta en estapas (stages)
◦ La entrada original es una colección
◦ Las salidas son documentos, cursores o colecciones
◦ Escrito en C++
◦ Trabaja bien con Shardings
http://www.slideshare.net/mongodb/aggregation-framework-36715147
$match $project $group $sort
52. Pipeline de agregación – algunas
etapas
$match: fitra documentos
$project: agrega o elimina
columnas en el documento
$group: aplica operaciones
de agrupación a cada grupo
de documentos ($sum,
$avg, $min, $max, etc)
$unwind: convierte
documentos en una matriz
con ciertas características
$sort: ordena los documentos
$limit /$skip: página los
documentos
$geoNear: ordena los
documentos por proximidad
geográfica
$lookup: realiza un left outer
join con otra colección en la
misma base de datos
http://www.slideshare.net/mongodb/aggregation-framework-36715147
53. Pipeline de agregación - etapas
Ejemplo:
http://www.slideshare.net/mongodb/aggregation-framework-36715147
54. Pipeline de agregación - etapas
Ejemplo lookup:
http://www.slideshare.net/mongodb/aggregation-framework-36715147
55. Pipeline de agregación – Ejemplo
lookup
https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#pipe._S_lookup
56. Pipeline de agregación – Ejemplo
lookup
https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#pipe._S_lookup
57. Caso de estudio – Consultas
avanzadas
◦ Map-Reduce:
Map: procesa
cada documento
y emite uno o
dos objetos y
Reduce: combina
la salida de la
operación Map.
58. Caso de estudio – Consultas
avanzadas
Operaciones de agregación de propósito simple:
comandos de base de datos de propósito especial
◦ Count: cuenta los elementos de una colección que cumplen
la condición de la consulta
◦ db.collection.count(consulta)
◦ db.collection.find(consulta).count()
◦ Disctint: Encuentra los valores diferentes de un campo
◦ db.collection.distinct(campo, consulta)
◦ Group
59. Caso de estudio – Consultas
avanzadas
db.collection.group({ key, reduce, initial [, keyf] [, cond] [, finalize] })
key documento
Campo o campos a agrupar. Retorna una “key object” para usar como la
clave de agrupamiento.
reduce función
Una función de agregación que opera sobre los documentos durante la
operación de agrupamiento. Puede retornar una suma o un conteo. Toma
dos argumentos: el actual documento y un documento resultado de la
agregación para el grupo.
initial Documento documento resultado de la agregación inicial
keyf Función
Opcional. Alternativa al campo clave. Especifica una funcion que crea un
“key object” para usar como clave de agrupamiento. Use keyf en lugar
de key para agrupar por campos calculados.
cond Documento
Criterios de selección para determinar qué documentos de la colección
procesar. Si se omite, se procesarán todos los documentos de la colección
para la operación del grupo.
finalize función
Opcional. Una función que ejecuta cada elemento en el conjunto de
resultados antes de que db.collection.group () devuelve el valor final. Esta
función puede o bien modificar el documento resultado o sustituir el
documento resultado como un todo.
60. Caso de estudio – Consultas
avanzadas - Explain
◦ Retorna informacion del plan de consulta para las
siguientes operaciones:
◦ aggregate(); count(); find(); group(); remove(); and update() methods.
◦ db.collection.explain().<method(...)>
◦ Presenta el plan de consulta (query plan) como un árbol de
etapas.
◦ Cada etapa pasa sus resultados (es decir, documentos o claves de índice) al
nodo padre.
◦ Los nodos hoja acceden a la colección o los índices.
◦ Los nodos internos manipulan los documentos o las claves de índice que se
derivan de los nodos secundarios.
◦ El nodo raíz es la etapa final de la que MongoDB deriva del conjunto de
resultados
61. Caso de estudio – Consultas
avanzadas - Explain
◦ Algunas de las operaciones del plan son:
◦ COLLSCAN Scan de una coleccion
◦ IXSCAN para búsqueda en el índice
◦ FETCH para recuperación de documentos
◦ SHARD_MERGE para mezclar results de fragmentos
◦ El explain tiene los siguientes parámetros opcionales
(modos de verbosity)
◦ queryPlanner: es el modo por defecto, retorna solamente el plan de consulta
◦ executionStats: muestra el plan de consulta e información de ejecución
◦ allPlansExecution: muestra todos los posibles planes de ejecución.
62. Caso de estudio – Consultas
avanzadas - Explain
Ejemplos
◦ db.products.explain().count( { quantity: { $gt: 50 } } )
◦ Retorna solo el plan de consulta
◦ db.products.explain("executionStats").find(
{ quantity: { $gt: 50 }, category: "apparel" }
)
◦ Retorna el plan de consulta y información de ejecución
◦ db.products.explain("allPlansExecution").update(
{ quantity: { $lt: 1000}, category: "apparel" },
{ $set: { reorder: true } }
)
◦ No modifica los datos pero retorna todos los posibles planes de ejecución
63. Caso de estudio – respaldos
Respaldo por copia de datos subyacentes:
◦ Se trata de una copia de snapshot en un punto del tiempo, sin
embargo no depende de mongo sino del sistema operativo.
mongodump - mongorestore
◦ mongodump: lee datos de una base de datos y crea archivos
Bson de alta fidelidad
◦ mogorestore: restaura una base de datos desde un archivo Bson.
mongoimport – mongoexport
◦ mongoexport es una utilidad que produce una exportación Json
o CSV de los datos almacenados en una instancia de MongoDB.
◦ mongoimport importa el contenido de un archivo Json o CSV
creado por mongoexport u otra herramienta de terceros.
64. Caso de estudio – Usos
Cualquier aplicación que necesite almacenar datos
semi estructurados
Algunos casos de uso
◦ Almacenamiento y registro de eventos
◦ Manejo de documentos y contenido
◦ Comercio Electrónico
◦ Alto volúmenes de lectura
◦ Aplicaciones móviles
◦ Manejo de contenido
◦ Almacenamiento de comentario
65. Próxima clase
BD Familia de columnas:
◦ Modelo de datos
◦ Operaciones
◦ Técnicas usadas
◦ Caso de estudio
Notas del editor
Full deployment. As many mongoS processes as you have app servers (for example); Config DBs are small but hold the critical information about where ranges of data are located on disk/shards.
Full deployment. As many mongoS processes as you have app servers (for example); Config DBs are small but hold the critical information about where ranges of data are located on disk/shards.