Uploaded by Paola Rosas

BD NoSQL Oriendas a Documento- Caso MongoDB

advertisement
GESTIÓN DE GRANDES
VOLÚMENES DE DATOS
Maestría en Sistemas de Información
Profa. Mercy Ospina
13/5/2023
Gestión de Grandes Volumenes de Datos
1
GESTIÓN DE GRANDES
VOLÚMENES DE DATOS
Unidad 4 Bases de Datos NoSQL Orientadas a
Documentos
Profa. Mercy Ospina
13/5/2023
Gestión de Grandes Volumenes de Datos
2
Agenda
Modelo de datos
Operaciones
Técnicas usadas
Cuando usar
Caso de estudio
Estructuras y datos
Consultas
Estructuras
Técnicas
Objetivos del tema
Clasificar las BD NoSQL según el modelo
de datos que implementa.
Identificar ámbitos de desarrollo y
requerimientos donde es
recomendable usar BD NoSQL y
establecer elementos que permitan
seleccionar el uso de estos sistemas.
Explorar y usar en casos prácticos
algunos motores de bases de datos
NoSQL.
Agenda
Modelo de datos
Operaciones
Técnicas usadas
Cuando usar
Caso de estudio
Estructuras y datos
Consultas
Estructuras
Técnicas
Modelo de datos
 Usa un modelo semiestructurado basado en
Json o XML
 El más usado en Json:
• 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
18/01/2017
Modelos de datos - taxonomía
6
Modelo de datos
7
Modelo de datos - Estructuras
Base de
datos
• Contenedor físico de
colecciones o
documentos
Colecciones
• Agrupaciones de
documentos, no todas las
BD Documento lo tienen
Documento
• Unidad básica de
datos en Json
Valores
• Atómicos
• Listas o arreglos
• Adjuntos (pdf, jpg, etc)
8
Caso de Estudio – Tipos de datos
• Los definidos por Json
- Cadenas de caracteres.
•Integer - Números enteros.
•Double - Números con decimales.
•Boolean - Booleanos verdaderos o falsos.
•Timestamp - Marcas de tiempo.
•Null - Valor nulo.
•Array - Arreglos de otros tipos de dato.
•Object - Otros documentos embebidos.
•ObjectID - Identificadores únicos creados por la Base de datos al crear
documentos sin especificar valores para el campo _id.
•Data Binaria - Punteros a archivos binarios.
•Javascript - código y funciones Javascript
•String
9
Caso de Estudio – Tipos de datos
10
Caso de Estudio – Tipos de datos
w3schools.com
11
Agenda
Modelo de datos
Operaciones
Técnicas usadas
Cuando usar
Caso de estudio
Estructuras y datos
Consultas
Estructuras
Técnicas
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
13
Agenda
Modelo de datos
Operaciones
Técnicas usadas
Cuando usar
Caso de estudio
Estructuras y datos
Consultas
Estructuras
Técnicas
Distribución de los datos
• Sharding automático:
• Por rango de clave, con servidor de metadata que
mantiene la ubicación de los rangos
• MongoDB
• HBase
• Hashing consistente
• CouchDB
Técnicas usadas - ejemplos
Problema
MongoDB
CouchDB
Topología
Cluster (maestro esclavo)
Anillo
Sharding
Control de concurrencia
Manejo de fallas temporales
Manejo de fallas permanentes
Particionamiento por rango,
particionamiento por hash y
splitting
Bloqueo compartido (S) para
lectura y Exclusivo (X) para
escritura con intentos de bloqueo
(IS e IX)
Servidor de configuración
Replica sets maestro esclavo con
elección de nuevo maestro cuando
se presentan fallas usando Paxos
Hashing Consistente DHT
MVCC y relojes de vector con
reconciliación durante lecturas
Sloppy Quorum y hinted handoff
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
Agenda
Modelo de datos
Operaciones
Técnicas usadas
Cuando usar
Caso de estudio
Operaciones
Consultas
Estructuras
Técnicas
Caso de Estudio
• 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 las
versiones hasta el 2018). Todas las versiones posteriores
al 16 de octubre de 2018, se publican bajo la Server Side
Public License (SSPL) v1.
• Última versión estable 6.0.1 el 19 de Agosto de 2022
• Guarda estructuras de datos en documentos
tipo JSON con un esquema dinámico (MongoDB llama
ese formato BSON)
• Escrito en C++. Go, Javascript y Python
• https://www.mongodb.com/es/what-is-mongodb
18
Caso de estudio
Caso de estudio
Caso de estudio
Caso de Estudio
• Trabaja en una configuración de sistema
distribuido Master-Slave propia o puede trabajar
en un cluster de Hadoop
• Es factible tanto en soluciones pequeñas como de
Big Data
• Soporta principalmente las propiedades CP del
teorema de CAP, con atomicidad sobre un
documento
• La documentación en:
• https://docs.mongodb.com/manual/
22
Caso de estudio
Caso de estudio
Caso de estudio
Agenda
Modelo de datos
Operaciones
Técnicas usadas
Cuando usar
Caso de estudio
Operaciones
Consultas
Estructuras
Técnicas
Caso de Estudio- Operaciones
• CRUD
• Create/Insert
• Agregan documentos nuevos a una colección, si la colección
no existe se crea
• Métodos
• Las operaciones insert se realizan sobre una colección. Esta
operación es atómica a nivel de documento.
https://docs.mongodb.com/manual/crud/
27
Caso de Estudio- Operaciones
• Create/Insert
28
Caso de Estudio- Operaciones
• db.collection.insertMany() puede insertar múltiples
documentos en una colección, recibe un arreglo de
documentos
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w:
21, uom: "cm" } },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom:
"cm" } },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w:
22.85, uom: "cm" } }
])
• Retorna un documento con los Objectid de los
documentos insertados
29
Caso de estudio - Operaciones
• CRUD
db.inventory.updateOne(
• Update
{ item: "paper" },
{$set: { "size.uom": "cm", status: "P" },
$currentDate: { lastModified: true } }
)
•db.collection.updateOne(<filter>, <update>, <options>)
•db.collection.updateMany(<filter>, <update>, <options>)
•db.collection.replaceOne(<filter>, <update>, <options>)
30
Caso de estudio - Operaciones
• CRUD
• Delete
• Otros métodos
•db.collection.remove()
•db.collection.deleteOne() New in version 3.2
•db.collection.deleteMany() New in version 3.2
31
Caso de estudio - Operaciones
• CRUD
• Escritura Masiva (Bulk Writes)
• MongoDB brinda a los clientes la capacidad de realizar
operaciones de escritura en masa.
• Las operaciones de escritura masiva afectan a
una sola colección
• El método es db.collection.bulkWrite()
• Operaciones soportadas
•
•
•
•
•
•
insertOne
updateOne
updateMany
replaceOne
deleteOne
deleteMany
32
Caso de estudio – Escritura Masiva
try {
db.pizzas.insertMany( [
db.pizzas.bulkWrite( [
{ _id: 0, type: "pepperoni", size: "small", price: 4
},
{ insertOne: { document: { _id: 3, type: "beef", size: "medium",
price: 6 } } },
{ _id: 1, type: "cheese", size: "medium", price: 7 },
{ insertOne: { document: { _id: 4, type: "sausage", size: "large",
price: 10 } } },
{ _id: 2, type: "vegan", size: "large", price: 8 }
{ updateOne: {
])
filter: { type: "cheese" },
update: { $set: { price: 8 } }
} },
{ deleteOne: { filter: { type: "pepperoni"} } },
{ replaceOne: {
filter: { type: "vegan" },
replacement: { type: "tofu", size: "small", price: 4 }
}}
])
} catch( error ) {
print( error )
}
33
Agenda
Modelo de datos
Operaciones
Técnicas usadas
Cuando usar
Caso de estudio
Operaciones
Consultas
Estructuras
Técnicas
Caso de Estudio - Consultas
una consulta se
dirige a una
colección
específica de
documentos .
Opcionalmente, se
puede imponer
límites o criterios
de ordenación a las
consultas..
Especifican criterios
o condiciones , que
identifican los
documentos que
MongoDB vuelve a
los clientes
Puede incluir una
proyección que
especifica los campos
de los documentos.
35
Caso de Estudio - Operadores
• Selección
•
•
•
•
Comparación
Lógicos
Elementos
Otros
• Proyección
• https://docs.mongodb.org/manual/reference/operator/query/
36
Consultas – Operadores de comparación
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
37
Consultas – Operadores lógicos
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.
38
Consultas – Operadores de Elementos
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> } }
39
Consultas – Operadores de Proyección
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> } }
40
Caso de Estudio - Consultas
41
Caso de Estudio - Consultas
• Correspondencia con SQL
MongoDB
SQL
db.inventory.find()
SELECT * FROM inventory
db.inventory.find( { status: "D" } )
SELECT * FROM inventory WHERE status
= "D"
db.inventory.find( { status: { $in: [ "A", "D" ]
}})
SELECT * FROM inventory WHERE status
in ("A", "D")
db.inventory.find( { status: "A", qty: { $lt: 30 }
})
SELECT * FROM inventory WHERE status
= "A" AND qty < 30
db.inventory.find( { $or: [ { status: "A" }, {
qty: { $lt: 30 } } ] } )
SELECT * FROM inventory WHERE status
= "A" OR qty < 30
db.users.find( { status: "A" }, { name: 1, status:
1})
SELECT id, name, status FROM user
WHERE status = "A"
db.users.find( { status: "A" }, { name: 1, status:
1, _id: 0 } )
SELECT name, status FROM user WHERE
status = "A"
42
Agenda
Modelo de datos
Operaciones
Técnicas usadas
Cuando usar
Caso de estudio
Operaciones
Estructuras y Técnicas
Consultas
Caso de estudio- Índices
• db.collection.createIndex( <key and index type specification>, <options> )
• Solo crea el índice si este no existe
• Los indices creados son del tipo B+ tree.
• Ejemplo db.event.createIndex({score: 1})
44
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
45
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, “score" : -1 } )
• Este índice soporta las siguientes consultas
• db.events.find().sort( { username: 1, score: -1 } )
• db.events.find().sort( { username: -1, score: 1 } )
46
Caso de estudio- Índices
• El uso de índices busca mejorar la eficiencia de las operaciones de consulta
47
Caso de estudio - Índices
• Otros tipos de índices
• Multiclave: para indexar el contenido almacenado
en arreglos
• Geoespacial: Para consultas sobre coordenadas
geográficas
• Text: soporta búsquedas sobre contenido de texto
en una colección.
• Hashed: crea un índice hash o aleatorio sobre los
valores de un campo.
48
Caso de estudio - Índices
• Limitaciones
• El tamaño total de una entrada de índice debe ser
menor a 1024 bytes
• Una colección no puede tener mas de 64 índices
• El nombre del índice no puede ser mayor a 128
caracteres
• Los índices compuestos no pueden tener más de 31
campos
• Una consulta no puede usar índices de texto y
geoespaciales a la vez
49
Caso de estudio Almacenamiento
• Motor de almacenamiento (storage engine)
• Componente principal responsable de la gestión de datos
• Maneja como son almacenados los datos tanto en disco como en
memoria principal.
• Seleccionar el motor adecuado puede impactar en el rendimiento de la
aplicación.
50
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 usando MVCC con
intención de bloqueo global
• Cifrado nativo: para encriptar archivos de datos
• Para escribir en disco se colocan los datos en una instantánea que sea
consistente con todos los archivos de datos y se marca un checkpoint que
garantiza la consistencia hasta ese punto.
• Utiliza un log de transacciones de escritura anticipada write-ahead log (WAL) en
combinación con checkpoints para garantizar la durabilidad de los datos.
51
Caso de estudio Almacenamiento
• MMAPv1
• Es el motor de almacenamiento original de MongoDB y es el motor de
almacenamiento por defecto para las versiones previas a la 3.2.
• Basado en archivos mapeados en memoria.
• Se destaca en las cargas de trabajo con inserciones de alto volumen,
lecturas y actualizaciones en el lugar.
• Una un log para almacenar todos los cambios a la base de datos al cual se
copia en disco con más frecuencia que los datos
• Todos los registros se encuentran contiguos en el disco, y cuando un
documento se vuelve más grande que el registro asignado, MongoDB debe
asignar un nuevo registro.
52
Caso de estudio Almacenamiento
• MMAPv1
• Las nuevas asignaciones requieren que MongoDB mueva un documento
y actualice todos los índices que hacen referencia al documento, lo que
lleva a la fragmentación del almacenamiento.
• De forma predeterminada, se deja relleno en los registros (“Power of 2
Sized Allocations”) que permite que el documento crezca como
resultado de actualizaciones minimizando al mismo tiempo la
probabilidad de reasignaciones.
• Usa automáticamente toda la memoria disponible como cache, de
manera dinámica otorgándola a otro proceso si es necesario.
53
Caso de estudio Almacenamiento
• El Motor de almacenamiento "In-Memory"
• solo está disponible en MongoDB Enterprise. En lugar de almacenar
documentos en el disco, se les retiene en memoria el mayor tiempo de
latencia de datos posible.
• Asi mismo mantiene en memoria índices, datos de configuración,
credenciales de usuario, entre otros.
• La data no persiste luego de hacer shutdown.
• No usa logs
• La concurrencia es a nivel de documento para operaciones de escritura.
54
Caso de Estudio – Arquitectura
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 .
55
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
56
Caso de estudio - Replicación
• Fallo del primario
• Automaticamente se elige como primario a uno de los secundarios
Algoritmo de paxos para elección de nuevo primario
57
Caso de estudio - Replicación
• Si el nodo se recupera
• Pasa a ser secundario
58
• Tipos de replicas
• Prioridad 0: Miembro del conjunto de replica que no puede ser primario
y no puede llamar a elecciones, sin embargo si puede votar
• Funciona como un respaldo por si otro miembro del set de réplicas no
está disponible
• Tipos de replicas
• Hidden: Mantiene una copia del primario pero es invisible a las
aplicaciones cliente. Además su prioridad siempre es 0
• Su tarea es para reportes y backup
• Tipos de replicas
• Arbitro (Arbiter): No mantiene una del set de datos y no puede ser
primario es invisible a las aplicaciones cliente pero puede votar
• Usado para lograr consenso en elecciones de primario
https://docs.mongodb.com/manual/core/replica-set-members/
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.
62
Caso de estudio - Sharding
Key Range
0..50
Key Range
51..100
Key Range
0..100
mongod
mongod
mongod
Escalabilidad para escribir
63
Caso de estudio - Sharding
Key Range
0..25
mongod
Key Range
26..50
mongod
Key Range
51..75
Key Range
76.. 100
mongod
mongod
Escalabilidad para escribir
64
Caso de estudio - Sharding
Key Range
0..25
Key Range
26..50
Key Range
51..75
Key Range
76.. 100
Primary
Primary
Primary
Primary
Secondary
Secondary
Secondary
Secondary
Secondary
Secondary
Secondary
Secondary
65
Caso de estudio - Sharding
Aplicación
MongoS
Key Range
0..25
MongoS
Key Range
26..50
MongoS
Key Range
51..75
Key Range
76.. 100
Primary
Primary
Primary
Primary
Secondary
Secondary
Secondary
Secondary
Secondary
Secondary
Secondary
Secondary
Caso de estudio - Sharding
Aplicación
Config
Config
MongoS
MongoS
MongoS
Config
Key Range
0..25
Key Range
26..50
Key Range
51..75
Key Range
76.. 100
Primary
Primary
Primary
Primary
Secondary
Secondary
Secondary
Secondary
Secondary
Secondary
Secondary
Secondary
Caso de estudio - Splitting
• 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.
68
Caso de estudio - Splitting
• 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/
69
Caso de estudio - Seguridad
Autenticación
Autorización
TLS/SSL
Solamente
Enterprise
Método
db.auth()
Control de
acceso Basado
en Roles
Encriptación de
transporte
Autenticación
por Kerberos y
LDAP
Mecanismos
Manejo de roles
y usuarios
Configuración
Encriptación
REST
Auditoria
70
Caso de estudio - Seguridad
• Método db.auth()
db.auth( {
user: <username>,
pwd: <password>,
mechanism:
<authentication mechanism>,
digestPassword: <boolean>
})
Parámetro
Tipo
Descripción
username
string
Especifica un usuario
existente con privilegios de
acceso a esta base de datos.
password
string
Especifica la contraseña
correspondiente
string
Opcional. Especifica
el mecanismo usado:
• SCRAM-SHA-1
• MONGODB-CR
mechanism
digestPassword boolean
Opcional. Determina si el
servidor recibe la contraseña
“digested” o “undigested”.
False = undigested
True = digested
71
Caso de estudio - Seguridad
• Mecanismos de Autenticación
• SCRAM-SHA-1:
•
•
•
•
Estandar de la IEFT (Internet Engineering Task Force)
Uno de los más usados para la autenticación de aplicaciones en Internet
Usado junto con TLS (Transport Layer Security) aumenta el nivel de seguridad de las aplicaciones
https://docs.mongodb.com/manual/core/security-scram-sha-1/
• MONGODB-CR
• Usan las credenciales del cliente (usuario, password, base de datos) para
permitir el acceso.
72
Caso de estudio - Seguridad
• MongoDB provee control de acceso basado en Roles
• Privilegios: acción permitida sobre un recurso
• Recurso: Base de datos, colección, conjunto de
colecciones, o el cluster
• Privilegios:
•
•
•
•
•
•
•
•
Query and Write Actions
Database Management Actions
Deployment Management Actions
Replication Actions
Sharding Actions
Server Administration Actions
Diagnostic Actions
Internal Actions
73
Caso de estudio - Seguridad
• Roles predefinidos
• Database User Roles
• Database Administration Roles
• Cluster Administration Roles
• Backup and Restoration Roles
• All-Database Roles
• Superuser Roles
• Internal Role
• https://docs.mongodb.com/manual/core/securitybuilt-in-roles/
74
Caso de estudio - Seguridad
• Roles definidos por el usuario
• Pueden heredar de otros roles
• db.createRole(role, writeConcern)
{
role:"<name>",
privileges: [
{ resource: {<resource>}, actions: [
"<action>", ... ] },
...
],
roles: [
{ role: "<role>", db
"<database>" }
"<role>",
...
]
}
:
|
75
Caso de estudio - Seguridad
• Creación de usuarios
• Se crean a partir de los Roles
• db.createUser(user, writeConcern)
{
user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } |
"<role>",
...
]
}
https://docs.mongodb.com/manual/reference/method/db.createUser/
76
Agenda
Modelo de datos
Operaciones
Técnicas usadas
Cuando usar
Caso de estudio
Operaciones
Técnicas
Consultas
Caso de estudio – Consultas avanzadas
• Consultas con documentos embebidos
db.inventory.insertMany( [
{ item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
{ item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
{ item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
{ item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);
db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )
db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )
No
retorna
un
resultado
Caso de estudio – Consultas avanzadas
• Consultas con documentos embebidos
db.inventory.insertMany( [
{ item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
{ item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
{ item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
{ item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);
db.inventory.find( { 'instock.qty': { $lte: 20 } } )
db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )
Caso de estudio – Consultas avanzadas
• Consultas con documentos embebidos
db.inventory.insertMany( [
{ item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
{ item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
{ item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
{ item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);
inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )
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.users.find( { type: 2 } );
while (myCursor.hasNext()) {
print(tojson(myCursor.next()));
var myCursor = db.users.find( { type: 2 } );
myCursor.forEach(printjson);
}
http://docs.mongodb.org/manual/core/cursors/
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
fases Map y Reduce.
Usa funciones de
Javascript
Operaciones de
agregación de
propósito simple:
• comandos de base de
datos de propósito
especial
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
$match
$project
$group
$sort
• Escrito en C++
• Trabaja bien con Shardings
http://www.slideshare.net/mongodb/aggregation-framework-36715147
Pipeline de agregación – algunas etapas
$match:
$project:
$group:
•fitra documentos
•agrega o elimina columnas
en el documento
•aplica operaciones de
agrupación a cada grupo de
documentos ($sum, $avg,
$min, $max, etc)
$unwind:
$sort:
$limit /$skip:
•convierte documentos en
una matriz con ciertas
características
•ordena los documentos
•página los documentos
$geoNear:
$lookup:
•ordena los documentos por
proximidad geográfica
•realiza un left outer join
con otra colección en la
misma base de datos
http://www.slideshare.net/mongodb/aggregation-framework-36715147
Pipeline de agregación - etapas
• Ejemplo:
Pipeline de agregación - etapas
• Ejemplo lookup:
http://www.slideshare.net/mongodb/aggregation-framework-36715147
Pipeline de agregación – Ejemplo lookup
https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#pipe._S_lookup
Pipeline de agregación – Ejemplo lookup
https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#pipe._S_lookup
Pipeline de agregación
db.orders.insertMany( [
{ _id: 0, name: "Pepperoni", size: "small", price: 19,
db.orders.aggregate( [
quantity: 10, date: ISODate( "2021-03-13T08:14:30Z" ) },
{ _id: 1, name: "Pepperoni", size: "medium", price: 20,
quantity: 20, date : ISODate( "2021-03-13T09:13:24Z" ) },
{ _id: 2, name: "Pepperoni", size: "large", price: 21,
// Stage 1: Filter pizza order documents by pizza size
{
quantity: 30, date : ISODate( "2021-03-17T09:22:12Z" ) },
$match: { size: "medium" }
{ _id: 3, name: "Cheese", size: "small", price: 12,
},
quantity: 15, date : ISODate( "2021-03-13T11:21:39.736Z" ) },
{ _id: 4, name: "Cheese", size: "medium", price: 13,
quantity:50, date : ISODate( "2022-01-12T21:23:13.331Z" ) },
// Stage 2: Group remaining documents by pizza name and calculate total quantity
{ _id: 5, name: "Cheese", size: "large", price: 14,
{
quantity: 10, date : ISODate( "2022-01-12T05:08:13Z" ) },
$group: { _id: "$name", totalQuantity: { $sum: "$quantity" } }
{ _id: 6, name: "Vegan", size: "small", price: 17,
}
quantity: 10, date : ISODate( "2021-01-13T05:08:13Z" ) },
{ _id: 7, name: "Vegan", size: "medium", price: 18,
quantity: 10, date : ISODate( "2021-01-13T05:10:13Z" ) }
])
])
https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#pipe._S_lookup
Pipeline de agregación
https://www.mongodb.com/docs/manual/reference/sql-aggregation-comparison/
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.
https://docs.mongodb.com/manual/core/map-reduce/
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
• Disctint: Encuentra los valores diferentes de un campo
db.runCommand(
{
db.runCommand( { count: 'orders' }
)
count: <collection or view>,
query: <document>,
limit: <integer>,
skip: <integer>,
comment: <any>
}
)
{ "n" : 26, "ok" : 1 }
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
• Disctint: Encuentra los valores diferentes de un campo
db.runCommand(
{
distinct: "<collection>",
key: "<field>",
query: <query>,
db.runCommand ( { distinct: "inventory", key: "dept" } )
readConcern: <read concern document>,
collation: <collation document>,
comment: <any>
}
)
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
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.
Caso de estudio – EXPLAIN
• Ejemplos
• db.products.explain().count( { quantity: { $gt: 50 } } )
• Retorna solo el plan de consulta
• db.products.find( { quantity: { $gt: 50 }, category: "apparel" }
).explain("executionStats")
• Retorna el plan de consulta e información de ejecución
• db.products.update({ quantity: { $lt: 1000}, category: "apparel" },
{ $set: { reorder: true } }).explain("allPlansExecution")
• No modifica los datos pero retorna todos los posibles planes de ejecución
Caso de estudio – Optimizador
• El optimizador de MongoDB, procesa las consultas y selecciona el
plan más eficiente con los índices disponibles.
• El optimizador de consultas solo almacena en caché los planes
para aquellas formas de consulta que pueden tener más de un
plan viable.
• Para cada consulta, el planificador de consultas busca en la
memoria caché del plan de consultas una entrada que se ajuste a
la forma de la consulta.
Caso de estudio – Optimizador
• Para cada consulta, el planificador de consultas busca en la
memoria caché del plan de consultas una entrada que se ajuste a
la forma de la consulta.
• Si no hay entradas coincidentes, genera planes candidatos para la
evaluación durante un período de prueba, elige un plan ganador, crea
una entrada de caché que contiene el plan ganador y lo utiliza para
generar los documentos resultantes.
• Si existe una entrada coincidente, el planificador de consultas genera un
plan basado en esa entrada y evalúa su desempeño a través de un
mecanismo de replanificación.
Caso de estudio – Optimizador
• Este mecanismo toma una decisión de aprobación / falla basada
en el rendimiento del plan y mantiene o desaloja la entrada de
caché. En el desalojo, el planificador de consultas selecciona un
nuevo plan utilizando el proceso de planificación normal y lo
almacena en caché.
• El planificador de consultas ejecuta el plan y devuelve los
documentos de resultados para la consulta.
Caso de estudio – EXPLAIN
• Ejemplo queryPlanner
{
"queryPlanner" : {
"plannerVersion" : <int>, "namespace" : <string>, "indexFilterSet" : <boolean>,
"parsedQuery" : {
...
},
"winningPlan" : {
"stage" : <STAGE1>,
...
"inputStage" : {
"stage" : <STAGE2>,
...
"inputStage" : {
...
}
}
},
"rejectedPlans" : [
<candidate plan 1>,
...
]
}
Caso de estudio – EXPLAIN
• Ejemplo execucionStats
"executionStats" : {
"executionSuccess" : <boolean>,
"nReturned" : <int>,
"executionTimeMillis" : <int>,
"totalKeysExamined" : <int>,
"totalDocsExamined" : <int>,
"executionStages" : {
"stage" : <STAGE1>
"nReturned" : <int>,
"executionTimeMillisEstimate" : <int>,
"works" : <int>,
"advanced" : <int>,
"needTime" : <int>,
"needYield" : <int>,
"isEOF" : <boolean>,
...
"inputStage" : {
"stage" : <STAGE2>,
...
"nReturned" : <int>,
"executionTimeMillisEstimate" : <int>,
"keysExamined" : <int>,
"docsExamined" : <int>,
...
"inputStage" : {
...
}
}
},
"allPlansExecution" : [
{ <partial executionStats1> },
{ <partial executionStats2> },
...
]
}
Download