Está en la página 1de 51

Taller MongoDB

2do Cuatrimestre 2016


Base de datos
Planificación
● Breve introducción a MongoDB
● Definir esquema a partir de un DER.
○ Aplicar desnormalización.
● Crear los distintos documentos.
● Insertar, eliminar, modificar.
● Realizar consultas.
○ Consultas de agregación
● Aplicar Map Reduce
● Presentamos el TP2
MongoDB
MongoDB
● Orientado a Documentos
● Gran soporte de consultas
● Replication
● Balanceo de carga - Sharding
● File Storage
● Map Reduce
● Server-side JavaScript execution
MongoDB
● As of July 2015, MongoDB is the fourth most popular type of database
management system, and the most popular for document stores.
● También tiene críticas!
○ Concurrencia
○ Memoria
○ Esquema no definido
MongoDB
En una misma colección, los documentos
pueden no tener un mismo esquema:
MongoDB
Tal vez no siempre es la mejor opción:
● No soporta transacciones
○ Nuestra aplicación debería simularlas.
○ Solo garantiza operaciones atómicas a nivel de documento.
● No existen JOINS
○ Para consultar datos relacionados tenemos que hacer más de una consulta.
● Funciones de agregación
○ No tienen la potencia de un sistema relacional.
○ Alternativas: Aggregation Framework, Map Reduce.
Consola
santiago@linux-qw22:~$ mongo
MongoDB shell version: 2.4.9
connecting to: test
>
Consola
● show databases

● use <db>

● show collections
Consola
Además tenemos un intérprete de Javascript para ampliar
la capacidad de trabajo:

>s=0;for(i=0;i<5;i++) s+=i;
>s
6
Diagrama
Desnormalización
● Qué debemos desnormalizar?

● En qué lugares desnormalizamos?

● Hay una sola forma de desnormalizar?


Desnormalización
Haciendo memoría:
● Las colecciones de MongoDB no necesitan definir un esquema.
○ Nuestra aplicación debería definirlo.
● ¿Tenemos que normalizar? ¿Desnormalizar?¿ Un híbrido entre
ambas?
○ Estas decisiones pueden afectar el rendimiento de la aplicación.
○ El esquema lo definen las consultas que vayamos a realizar con
más frecuencia
● No olvidar la escalabilidad a la hora de diseñar:
○ MongoDB es especialmente útil en sistemas que la requieran.
Contamos con replicación y sharding.
Desnormalización
Insertar datos
● Qué utilizamos como primary key? como foreign key?

● Quién es el responsable del ingreso de datos?

● Quien es el responsable de respetar el esquema?


Esquema resultante
El esquema debe estar orientado a resolver las
siguientes consultas:
● De los profesores, sus datos y todos los cursos que dicta
(con los datos de los cursos inclusive).

● De los alumnos, sus datos y los números de los cursos


que cursa.

● De los cursos, sus datos y la ‘luniv’ de los alumnos que


los cursan.
Esquema resultante
Alumnos: Cursos: Profesores:
{ { {
"luniv": String, "numero": Int, "nroLegajo": Int,
"nombre": String, "nombre": String, "nombre": String,
"carrera": String, "tipo": String, "cargo": String,
"edad": Int, "alumnos": [String] "cursos": [ {} ]
"telefonos": [String], } }
"cursos": [Int]
}
Conectando a mongoDB
Seguir los siguientes pasos para conectar
roboMongo al servidor:
● Seguir las instrucciones del pizarrón para descargar
roboMongo y ejecutarlo.

● Seguir los pasos de las siguientes diapositivas para


conectar roboMongo al servidor mongoDB.
Metodos de MongoDB
Operaciones sobre Collections
● db.collection.find()

● db.collection.insert()

● db.collection.update()
Operaciones sobre Collections
Operaciones sobre Collections
Realizar las siguientes operaciones:

- Insertar un alumno en la colección ‘alumnos’.

- Realizar un update en la edad del alumno


insertado.
-
- Borrar el alumno insertado.
Consultas
● Tomar todos los alumnos entre 18 y 22 años

● Devolver los alumnos del curso número "55"

● Contabilizar la cantidad de profesores por cargo

● La carrera que tenga más de 2 alumnos entre 23 y 30 años


Consultas
● Tomar todos los alumnos entre 18 y 22 años
Consultas
● Tomar todos los alumnos entre 18 y 22 años
○ db.alumnos.find(
{edad: {"$gt": 18, "$lt": 22}})
Consultas
● Devolver los alumnos del curso número 55
Consultas
● Devolver los alumnos del curso número 55
○ db.alumnos.find(
{"cursos": 55})
Consultas
● Devolver los alumnos del curso número 55
○ db.alumnos.find(
{"cursos": 55})

● La cantidad de alumnos del curso…


○ db.alumnos.count(
{"cursos": 55})
Consultas
● Contabilizar la cantidad de profesores por
cargo

¿Cómo hacemos agregación?


Consultas
Agreggate
Consultas
Aggregation Pipeline Operators
Consultas
● Contabilizar la cantidad de profesores por
cargo
Consultas
● Contabilizar la cantidad de profesores por
cargo
○ db.profesores.aggregate([{
$group: { _id: "$cargo",
total: {$sum: 1}} }])
Consultas
● La carrera que tenga más de 2 alumnos entre
23 y 30 años
Consultas
● La carrera que tenga más de 2 alumnos entre 20
y 30 años
○ db.alumnos.aggregate([
{$match: {"edad": { $lt: 30, $gt: 20}}},
{$group: { _id: "$carrera",
total: {$sum: 1}} },
{$match: {"total": {$gt: 2}}} ])
Map Reduce
Se define varios pasos utilizando funciones:

● (opcional) query: filtra los documentos por un


atributo.

● map: función que emite una tupla <key, value>


por cada documento. Agrupa todos los key y se
devuelve la lista de values.

● reduce: función que toma cada <key, [value]> y


devuelve el resultado.
Map Reduce
Consulta 1
● Devolver el nombre de los Alumnos con más
de 5 teléfonos
Consulta 1
● Devolver el nombre de los Alumnos con más
de 5 teléfonos
○ Map: filtro cada alumno por su cantidad de
teléfonos. Si es mayor a 5, emito <Luniv, Nombre>
○ Reduce: Devuelvo cada alumno
Consulta 1
● Devolver el nombre de los Alumnos con más
de 5 teléfonos

○ var m = function(){
if(this["telefonos"].length>5)
{emit(this["luniv"],this["nombre"])
}}
○ var r = function(key, values){ return values[0]}
○ db.alumnos.mapReduce(m, r, {out: "map_res"})
Consulta 2
● La cantidad de Profesores que hay por cargo
Consulta 2
● La cantidad de Profesores que hay por cargo
○ Map: emitimos <cargo, 1>
○ Reduce: sumamos todos los elementos de la lista
Consulta 2
● La cantidad de Profesores que hay por cargo

○ var m = function(){emit(this["cargo"],1)}
○ var r = function(key, values){ return Array.sum(values)}
○ db.profesores.mapReduce(m, r, {out: "map_res"})
Consulta 3
● Cantidad de alumnos totales en cursos
obligatorios.
Consulta 3
● Cantidad de alumnos totales en cursos
obligatorios.
○ Map: si es curso obligatorio emitimos
<tipo de curso, #alumnos>
○ Reduce: sumamos cantidad de alumnos.
Consulta 3
● Cantidad de alumnos totales en cursos
obligatorios.

○ var m = function(){
if(this["tipo"] =="obligatorio"){
emit(this["tipo"],this["alumnos"].length)}
}
○ var r = function(key, values){
return Array.sum(values) }
Consulta de tarea
● Devolver los Alumnos más viejos por cada
curso.

También podría gustarte