Introducción a y Spring Data



Documentos relacionados
Trabajos de Ampliación. Bases de datos NoSQL.

1

Lenguaje de Consulta Estructurado S Q. Lenguaje de Consulta Estructurado. Wael Najjar /

MASTER CLASS. Curso de Introducción MongoDB. Juan Manuel Parrilla. Consultor de Amaris en Telefónica I+D. Release Engineer * FUENTE DE DOCUMENTACIÓN :

Oracle 12c DISEÑO Y PROGRAMACIÓN

BASE DE DATOS QUÉ ES UNA BASE DE DATOS?

Fundamentos de Oracle

Conceptos Avanzados de Bases de datos

Curso de PHP. Acceso a bases de datos MySQL en PHP

MANUAL BÁSICO DEL LENGUAJE SQL

MySQL y Sesiones en PHP. Área de Ingeniería Telemática

ATLAS MANUAL DE USUARIO ARBOL ACCESIBLE

ATLAS MANUAL DE USUARIO SERVICIO DE AUDITORIA

Acceso a bases de datos MySQL con PHP

SINTAXIS DE SQL-92. <definición de esquema >::= CREATE SCHEMA <cláusula de nombre de esquema> [ <elemento de esquema>... ]

DEFINICIÓN DE ONTOLOGÍAS EN SOFIA2

CURSO DE SQL SERVER 2005

LENGUAJE DE CONSULTA ESTRUCTURADO - SQL CONTENIDO

Sql Basico. Seminar Introduction

Práctica sobre compartición de instancias remotas.

Clases y Objetos. Informática II Ingeniería Electrónica

INTRODUCCION. entidades. Modelo lógico de la base de datos. Matricula. carne. codigo_curso. año semestre nota. propiedades

Curso Online de Oracle 10g

ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA Programación de sitios web Act 11: Reconocimiento de la unidad 3

Introducción al desarrollo de RIA's con Adobe Flex 3.0 Dia 4

- Bases de Datos - - Diseño Físico - Luis D. García

Java Inicial (20 horas)

TRANSACT-SQL, DISEÑO Y PROGRAMACIÓN DE BASES DE DATOS EN SQL SERVER 2008

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

T12 Vistas y tablas temporales

LENGUAJE ESTRUCTURADO DE CONSULTAS SQL (2)

Bases de Datos SQL - Ejemplos

Capítulo 12: Indexación y asociación

Bases de Datos: Structured Query Language (SQL)

BASES DE DATOS - SQL. Javier Enciso

Bases de datos. 1. Introducción

acenswhitepapers Bases de datos NoSQL. Qué son y tipos que nos podemos encontrar

Repaso de Conceptos Básicos de Bases de Datos

UNIVERSIDAD DEL ISTMO CAMPUS IXTEPEC LIC. INFORMATICA GRUPO 508 PROCEDIMIENTOS ALMACENADOS EN SQL SERVER 2000

TEMA 6: MODIFICACIÓN DE LA BASE DE DATOS EN SQL

INSTITUCIÓN EDUCATIVA GABRIEL GARCIA MÁRQUEZ BASE DE DATOS. DESARROLLO DE SOFTWARE Página 1 de 28 SQL SQL

PHP Perfect SQL v1.0 (SQL perfectas en PHP)

Microsoft SQL Server 2005

Gestion de archivos. Problemas al almacenar datos sólo en la memoria:

Base de datos Procedimientos Almacenados y Funciones

Tema 11 Bases de datos. Fundamentos de Informática

A.1. Definiciones de datos en SQL

Base de datos Lenguaje SQL

Conectar Flash con Access usando MDM Zinc

Registro y Comunicación Automatizada a Bases de Datos

Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro

: COMPUTACIÓN E INFORMATICA : Ingeniería de Software Ingeniería de Redes y Comunicaciones : Administración de Bases de Datos I : T-INF127

ÍNDICE PRIMERA PARTE... 17

m047a Curso Programando una Base de Datos SQL Server 2008, 36 h Creación B.D. y Constraints

Primera Escuela de la Red Temática SVO. Madrid, Noviembre, 2006 JAVA BÁSICO. Raúl Gutiérrez Sánchez LAEFF - INTA raul@laeff.inta.

Bases de Datos 2. Teórico

Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros

Utilización del programa de Orabench Versión para Migración. Describir los pasos para la utilización del programa Orabench de Oracle.

Nuevas Características de la Versión 9.1 de PostgreSQL. Alcides Rivera Posso

Curso PHP Advanced and Ajax

Introducción a los Sistemas de Gestión de Bases de Datos

UNIVERSIDAD AUTONOMA DE LOS ANDES UNIANDES LENGUAJE SQL. SQL es un estándar un lenguaje estructurado para consultas

BASES DE DATOS EN VISUAL BASIC ACCESS + SQL

Herramientas de Administración Para Oracle Database 12c

De uno a uno : Ejemplo de una llave primaria a otra llave primaria De uno a muchos : Ejemplo de una llave primaria a una Regular o Foránea.

2071 Querying Microsoft SQL Server 2000 with Transact- SQL

Iniciando con Oracle. Índice de contenido. Ingresando a Oracle. Cambiando Su Contraseña. Ingresando un Comando SQL en SQL*Plus

Jaime Hernández P. SIG

Como manejador de base de datos elegimos utilizar Absolute Database, que es un

PHP Y BASES DE DATOS. Introducción a SQL

public static void main(string[ ] args) { Numero f1 = new Numero(3); Numero f2 = new Numero(4); Numero f3 = f1; f1.value = f2.value; Numero f4 = null;

Administración de la producción. Sesión 10: Gestor de Base de Datos (Access)

Número de Práctica: 1 Nombre de la Práctica: Comunicación Cliente Servidor Vía Sockets Java con Sistema Manejador de Bases de Datos

U.E JUAN DE VELASCO CREAR DATOS EN SQL

GALA CONCEPTO COMMIT, ROOLBACK SAVEPOINTS (SAVE TRANSACTION) No Consultas. Definiciones Transacciones ( L33 )

Formato para prácticas de laboratorio

Software de Comunicaciones (2) Manual de Usuario Consola

PR.T5. GESTORES BIBLIOGRÁFICOS

Symfony. Framework para el desarrollo de aplicaciones Web con PHP

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Metacoretex-NG NcN 2005 Palma de Mallorca

1. DML. Las subconsultas

Solución Examen Junio 2007 (a) Ejercicio GeoTaxi (1h 20 min.) Diagrama de Casos de Uso y. Casos de uso (2,5 puntos) Modelo de Dominio (1,5 puntos)

ÍNDICE. Introducción... Capítulo 1. Novedades de Access

%& %)& '$!%*+ $, %%%&$ %%

Ejercicios - Persistencia en Android: ficheros y SQLite

Programación Orientada a Objetos con Java

Curso de Community Manager 2013

UNIDAD DIDACTICA 1: SISTEMAS GESTORES DE BASES DE DATOS

TUTORIAL DESARROLLO DE APLICACIONES PARA EVOLUTION CON MS ACCESS

8 SQL SERVER 2008 RA-MA

El lenguaje de programación Java

&' ' ' !,- (& ', Este tutorial trabaja sobre NetBeans 6.1 y MySQL 5.0. Crear un nuevo proyecto usando la ventana que se indica a continuación: !!

GUÍA DE TRABAJO N 11 LENGUAJE C# Programación de Software Articulación SENA Grado 10 Ing. Néstor Raúl Suarez Perpiñan Página 2 de 11

Aplicaciones de las vistas Concepto de vista Vistas en SQL Vistas en SQL.

Unidad 9:GESTIÓN Y ALMACENAMIENTO DE LA INFORMACIÓN EN FORMATOS XML

Bases de datos relacionales y el modelo entidad-relación

Restricciones de Integridad

XPERTO EN DISEÑO DE PÁGINAS WEB

Big Data y BAM con WSO2

Transcripción:

Introducción a y Spring Data Miguel Olivares y Leonardo Menezes (@moliware) (@leonardomenezes)

Qué es MongoDB? Base de datos orientada a documentos Sin esquema Escalable DB => Colección => Documento

Qué es una colección? Es un grupo de documentos. Se identifica con un nombre Es el equivalente a una tabla en un modelo relacional

Qué es un documento? Un conjunto de pares clave-valor Coloquialmente un hash, map o dictionary Formato BSON

Arquitectura

Consola Consola javascript completa Cliente MongoDB

Por qué MongoDB? Fácil escalabilidad Flexibilidad Alto rendimiento Consultas potentes MapReduce

Benchmark (45 M de documentos) Tiempo medio de inserción Tamaño en disco SolR 0.603(ms) 49 GB CouchDB 0.297(ms) 43 GB Cassandra 0.516(ms) 50 GB MongoDB 0.040(ms) 43 GB

Introducción a Spring Data

Por que Spring Data? Mapeo/Conversión entre POJOs y docs MongoDB MongoTemplate Implementación automática de Repository(DAO) DSL basado en Java para Query, Criteria y Update Soporte a persistencia mixta(cross-store persistance) Integración con GeoSpatial de Mongo Integración con Map Reduce de Mongo Administración y monitorización por JMX

Diseño de una aplicación Diseño de documentos Consultas de la aplicación Optimización de las consultas

Diseño de documentos Identificar tipos de documentos Separar cada tipo de documento en distintas colecciones Referenciar vs Duplicar

Diseño de documentos Identificar tipos de documentos Separar cada tipo de documento en distintas colecciones Referenciar vs Duplicar Consistencia Consultas extras Inconsistencia Documento autodescriptivo

Documentos Usuario _id name following Tweet _id text date user geo

Usuarios name : Nombre de usuario following: Array de referencias a usuarios

Tweets text : texto date : objeto Date de javascript. user: referencia al usuario geo: coordenadas

Modelo MongoDB

Modelo Relacional

Inserción de usuarios var miguel = {"name" : "miguel", "following" : []} db.user.save(miguel) var leonardomenezes = {"name" : "leonardomenezes", "following" : [new DBRef("user", miguel._id)]} db.user.save(leonardomenezes)

Inserción de Tweets var tweet = {"text" : "Tweet ejemplo", "date" : new Date(), "user" : new DBRef("user", leonardomenezes._id), "geo" : { "x" : 1, "y" : 1 } } db.tweet.save(tweet)

Actualización de documentos Update tipo SQL Posibilidad de upsert, es decir, si no existe lo crea Existen muchos update modifiers : $inc, $set, $unset, $push, $pushall, $addtoset, $pop, $pull, $pullall, $rename, $bit

Actualización de documentos El usuario miguel ahora sigue a leonardomenezes: var ref_leo = new DBRef("user", leonardomenezes._id) db.user.update({"name" : "miguel"}, {$push: {"following" : ref_leo}})

MongoDB Java Driver public void ejemplo1() throws UnknownHostException, MongoException { Mongo mongo = new Mongo("localhost"); DB db = mongo.getdb("database"); db.dropdatabase(); DBCollection users = db.getcollection("users"); BasicDBObject usuario = new BasicDBObject(); usuario.put("nombre", "Marco Martinez"); users.insert(usuario); BasicDBObject usuario2 = new BasicDBObject(); usuario2.put("nombre", "Leonardo Menezes"); usuario2.put("following", new DBRef(db, "users", usuario)); users.insert(usuario2); }

MongoTemplate Mapeo/Conversión de POJO s

Mapeo de los Documentos @Document(collection = "tweets") public class Tweet { private ObjectId id; private String text; private Date date; @DBRef private User user; @Document(collection = "users") public class User { private ObjectId id; private String name; @DBRef private Set<User> following;... getters y constructor... private double[] coordinate;... getters y constructor...

Configuración de MongoTemplate @Configuration public class AppConfig { } @Bean public Mongo mongo() throws UnknownHostException, MongoException { return new Mongo("localhost"); } @Bean public MongoTemplate mongotemplate() throws UnknownHostException, MongoException { return new MongoTemplate(mongo(), "database"); }

Inserción con MongoTemplate /** * Ejemplo sencillo de inserción */ private void ejemplo1() { User user = new User("Marco Martinez"); User user2 = new User("Alejandro Marqués"); User user3 = new User("Javier Alba"); mongotemplate.save(user); logger.info("users " + user + " saved"); mongotemplate.save(user2); logger.info("users " + user2 + " saved"); mongotemplate.save(user3); logger.info("users " + user3 + " saved"); user.follow(user2); mongotemplate.save(user); logger.info("users " + user + " updated"); } INFO - Users User [id=4eb846971a8868b98ed3d7c3, name=marco Martinez, following=0] saved INFO - Users User [id=4eb846971a8868b98ed3d7c4, name=alejandro Marqués, following=0] saved INFO - Users User [id=4eb846971a8868b98ed3d7c5, name=javier Alba, following=0] saved INFO - Users User [id=4eb846971a8868b98ed3d7c3, name=marco Martinez, following=1] updated

Update Modifiers con Spring Data /** * Ejemplo de acutalización */ public void ejemplo2() { mongotemplate.updatefirst(new Query(new Criteria("name").is("Marc Martinez")), new Update().set("name", "Marco Martinez"), User.class); User user = mongotemplate.findone(new Query(new Criteria("name").is("Marco Martinez")), User.class); User user3 = mongotemplate.findone(new Query(new Criteria("name").is("Javier Alba")), User.class); mongotemplate.updatefirst(new Query(new Criteria("name").is("Marco Martinez")), new Update().addToSet("following", user3), User.class); user = mongotemplate.findone(new Query(new Criteria("name").is("Marco Martinez")), User.class); logger.info("user found: " + user); } INFO - User found: User [id=4eb84a0e1a885514a5745b2d, name=marco Martinez, following=2]

Diseño de una aplicación Diseño de documentos Consultas de la aplicación Optimización de las consultas

Consultas en MongoDB SELECT a,b FROM users SELECT * FROM users WHERE age=33 SELECT * FROM users WHERE age=33 ORDER BY name SELECT * FROM users WHERE age=33 ORDER BY name LIMIT=10 OFFSET=0 db.users.find({}, {a:1,b:1}) db.users.find({age:33}) db.users.find({age:33}).sort({name:1}) db.users.find({age:33}).sort({name:1}).limit(10).skip(0)

Perfil de usuario Seguidores Mis tweets

Consultas - Seguidores SELECT user_following.following_id FROM user, user_following WHERE user.name = leonardomenezes AND user.id = user_following.user_id db.user.findone({"name" : "leonardomenezes"}, { following : 1});

Consultas - Mis Tweets select * from tweet where tweet.user_id=x order by date DESC db.tweet.find({"user.$id" : X}).sort({'date' : -1})

Más consultas MongoDB SELECT * FROM users WHERE age>33 SELECT * FROM users WHERE name LIKE "Joe%" SELECT * FROM users WHERE a=1 or b=2 SELECT COUNT(*) FROM users db.users.find({age:{$gt:33}}) db.users.find({name:/^joe/}) db.users.find({$or:[{a:1},{b:2}]}) db.users.count()

Más operadores $where + código javascript $gt, $lt, $gte, $lte $all, $exists, $mod, $ne, $in, $nin, $nor, $or, $and, $size, $type...

Timeline SELECT * FROM tweet WHERE user_id = X OR user_id =... ORDER BY date db.tweet.find({"user.$id" : {$in : ids}}).sort({'date' : -1})

MongoRepository(DAO) CRUD(CrudRepository) count, delete, deleteall, exists, findone, save... Paginación/Ordenación(PagingAndSortingRepository) Métodos de búsqueda dinámicos

Repositorios count() Returns the number of entities available. delete(id id) Deletes the entity with the given id. findall(pageable pageable) Returns a Page of entities meeting the paging restriction provided in the Pageable object. findall(sort sort) Returns all entities sorted by the given options. delete(iterable<? extends T> entities) Deletes the given entities. delete(t entity) Deletes a given entity. deleteall() Deletes all entities managed by the repository. exists(id id) Returns whether an entity with the given id exists. findall() Returns all instances of the type. findone(id id) Retrives an entity by its primary key. save(iterable<? extends T> entities) Saves all given entities. save(t entity) Saves a given entity.

UserRepository y TweetRepository @Repository public interface UserRepository extends MongoRepository<User, ObjectId> { } public User findbyname(string name); @Repository public interface TweetRepository extends MongoRepository<Tweet, ObjectId> { } public List<Tweet> findbytextlike(string text); public List<Tweet> findbydatelessthan(date date); @Query("{ 'user': {'$ref': 'users', '$id': { '$oid':?0 } } }") public List<Tweet> findbyuserid(string id);

Configuración de los Repositorios <context:annotation-config /> <context:component-scan base-package="com.paradigmatecnologico" /> <mongo:repositories base-package="com.paradigmatecnologico" />

Inserción y Consulta con Repositorios /** * Ejemplo de consultas con Repositorios */ public void ejemplo3() { User user = userrepository.findbyname("alejandro Marqués"); logger.info("user found:" + user); tweetrepository.save(new Tweet("Hola mundo", new Date(), user, new double[] { 1.0, 0.1 })); List<Tweet> tweets = tweetrepository.findbyuserid(user.getid().tostringmongod()); logger.info("found " + tweets.size() + " tweets"); List<Tweet> tweetshola = tweetrepository.findbytextlike("hola"); logger.info("found " + tweetshola.size() + " tweets"); } INFO - User found:user [id=4eb84a0e1a885514a5745b2e, name=alejandro Marqués, following=0] INFO - Found 1 tweets INFO - Found 1 tweets

Customizando Repositorios public interface IAdvancedTweetRepository { } public List<Tweet> timeline(list<objectid> ids); public class AdvancedTweetRepositoryImpl implements IAdvancedTweetRepository { @Override public List<Tweet> timeline(list<objectid> ids) { return mongotemplate.find(new Query(new Criteria("user.$id").in(ids)), Tweet.class);} } } public interface TweetRepository extends MongoRepository<Tweet, ObjectId>, IAdvancedTweetRepository { }

Consultando el Timeline /** * Ejemplo de consulta timeline/repositorios customizados */ public void ejemplo4() { User user = userrepository.findbyname("marco Martinez"); List<ObjectId> following = new LinkedList<ObjectId>(); for (User currentfollowing : user.getfollowing()) { following.add(currentfollowing.getid()); } following.add(user.getid()); List<Tweet> tweets = tweetrepository.timeline(following); logger.info("total tweets found: " + tweets.size()); }

Diseño de una aplicación Diseño de documentos Consultas de la aplicación Optimización de las consultas

Índices Son muy similares a los índices MySQL Un índice es un B-Tree Necesarios cuando necesitas ordenar Para hacer un campo único

Índices Optimiza el uso de memoria Son útiles cuando las consultas devuelven parte de los documentos

Índices de la aplicación db.tweet.ensureindex({ user.$id : 1, date : -1}) db.user.ensureindex({ name : 1}, { unique : true})

Índices en Spring Data /** * Creando indices */ public void ejemplo5() { IndexDefinition nameindex = new Index().on("name", Order.ASCENDING).unique(Duplicates.DROP); mongotemplate.ensureindex(nameindex, User.class); GeospatialIndex geoindex = new GeospatialIndex("coordinates"); mongotemplate.ensureindex(geoindex, Tweet.class); }

Temas Avanzados Geolocalización Trending Topics Retweets

Geolocalización Requiere un índice especial El campo tiene que tener el formato: { x : 2, y : 3} [2, 3] { latitude : 2, longitude : 3}

Geolocalización db.tweet.ensureindex({ geo : 2d }) db.tweet.find({ geo : { $near : [1,0]}}).limit(10) db.tweet.find({ geo : { $within : { $center : [{ x : 0, y : 0},5]}}})

Geolocalización en Spring Data /** * Busquedas Geo */ public void ejemplo6() { List<Tweet> tweets = mongotemplate.find(new Query(new Criteria("coordinate").within(new Circle(3.0, 3.0, 5))), Tweet.class); logger.info("tweets found: " + tweets.size()); tweets = mongotemplate.find(new Query(new Criteria("coordinate").within(new Circle(3.0, 3.0, 1))), Tweet.class); logger.info("tweets found: " + tweets.size()); } INFO - Tweets found: 3 INFO - Tweets found: 0

Trending Topics Repeticiones de cadenas de palabras Analizar los tweets de la última hora

MapReduce MapReduce is the Uzi of aggregation tools Proceso en background Dos pasos: map y reduce ( y finalize)

Map Procedimiento que se ejecuta una vez sobre cada documento. Cada map emite 0 o más pares clave, valor

Reduce Procedimiento que se ejecuta una vez por cada clave La entrada es la clave y la lista de valores que fueron emitidas con esa clave La salida puede ser cualquier estructura de datos

Finalize Se ejecuta justo antes de guardar los resultados Útil para construir un resultado final, borrar elementos redundantes, etc

Resultado El resultado final se almacena en una colección Documentos con el formato: { } _id : clave_emitida, value: resultado_reduce

Map var map = function() { var words = this.text.split(" "); }; for (var i = 0; i < words.length; i += 1){ for (var j = i; j < words.length; j += 1){ // Slice [inclusive, exclusive) sub_words = words.slice(i, j + 1); sub_sentence = sub_words.join(" "); emit(sub_sentence, sub_words.length * sub_words.length); } }

Map Entrada: { } text : hola que tal Se emite: hola, 1 hola que, 4 hola que tal, 9 que tal, 4 que, 1 tal, 1

Reduce var reduce = function(key, emits) { var score = 0; for (var i in emits){ score += emits[i]; } return score; };

Ejecución Ejecución: db.tweet.mapreduce(map, reduce, {"out" : "TTs"}) Consulta: db.tts.find().sort({value: -1}).limit(10)

Finalize Reducir de palabras (preposiciones, conjunciones, etc) Filtrado de trending topics que están contenidos en otros

Map Reduce Spring Data /** * Ejemplo de MapReduce */ public void ejemplo7() { MapReduceOptions opts = new MapReduceOptions(); opts.outputcollection("tt"); opts.limit(15); MapReduceResults<TrendingTopic> results = mongotemplate.mapreduce("tweets", "classpath:map.js", "classpath:reduce.js", opts, TrendingTopic.class); }

Map Reduce Spring Data @Repository public interface TrendingTopicRepository extends MongoRepository<TT, String> { } @Document(collection = "TT") public class TT { } @Id private String id; private float value; /** * Consultando resultado del MapReduce */ public void ejemplo8() { Page<TT> tt = trendingtopicrepository.findall(new PageRequest(0, 10, new Sort(Direction.DESC, "value"))); logger.info("trending topics found: " + tt.getnumberofelements()); }

Retweets En twitter es un poco caótico (RT, via...) Insertar tweet indicando que es un retweet haciendo referencia al tweet original Modificar el tweet original para llevar una cuenta de retweets

Otros usos en aplicaciones Analytics Logs Minería de twitter

Preguntas????????

Referencias MongoDB: The definitive guide 50 Tips and Tricks for MongoDB Developers Spring Data MongoDB Código de los ejemplos Spring Data