NoSql y MongoDB

Post on 10-May-2015

2.052 views 1 download

description

Una visión general de las bases de datos NoSQL y su tipología.Una introducción a MongoDB y su uso desde Java y con Spring-Data

Transcript of NoSql y MongoDB

Bases de datos NoSQL y MongoDBDavid Gómez

miércoles 25 de enero de 12

Un vistazo a las soluciones NoSQL

3

miércoles 25 de enero de 12

¿Qué es NoSQL?

4

(cc) Photo by mwin - http://www.flickr.com/photos/wingler/3429634150

miércoles 25 de enero de 12

¿Qué es NoSQL?

4

(cc) Photo by mwin - http://www.flickr.com/photos/wingler/3429634150

miércoles 25 de enero de 12

¿Qué es NoSQL?

4

(cc) Photo by mwin - http://www.flickr.com/photos/wingler/3429634150

NoSQL !== no SQL

Not only SQL

miércoles 25 de enero de 12

¿Qué es NoSQL?

Non Relational

Distributed

Horizontally scalable

5

miércoles 25 de enero de 12

Motivaciones

6

miércoles 25 de enero de 12

Motivaciones

Aplicaciones web ultra-escalables

Gran cantidad de datos

Velocidad de guardado

Alto número de peticiones

Máxima disponibilidad

6

miércoles 25 de enero de 12

Características

Replicado (particionado horizontal)

Sin esquemas (versatibilidad, adaptabilidad)

BASE (not ACID)

7

miércoles 25 de enero de 12

Características: BASE vs ACID

Atomicity, Consistency, Isolation, Durability

Basically Available, Soft state, Eventual consistency

8

(cc) Photo by zhouxuan12345678 - http://www.flickr.com/photos/53921113@N02/5645102295/

miércoles 25 de enero de 12

9

orientadas a Columna orientadas a Documento

orientadas a GrafosKey-value

Tipos

miércoles 25 de enero de 12

Orientadas a columna

10

(cc) Photo by profzuckerk - http://www.flickr.com/photos/profzucker/4630958694

miércoles 25 de enero de 12

Orientadas a columna

10

(cc) Photo by profzuckerk - http://www.flickr.com/photos/profzucker/4630958694

Configuración individual de columnas por fila

miércoles 25 de enero de 12

Orientadas a columna

11

(cc) Photo by Ash Brian - http://www.flickr.com/photos/ashbrian/2977673855

Configuración individual de columnas por fila

También conocidas como BigTable (google paper)

miércoles 25 de enero de 12

Orientadas a columna

11

(cc) Photo by Ash Brian - http://www.flickr.com/photos/ashbrian/2977673855

Configuración individual de columnas por fila

También conocidas como BigTable (google paper)

Tamaño

Alta carga de escrituras

Disponibilidad

MapReduce

miércoles 25 de enero de 12

Orientadas a columna

11

(cc) Photo by Ash Brian - http://www.flickr.com/photos/ashbrian/2977673855

Configuración individual de columnas por fila

También conocidas como BigTable (google paper)

Tamaño

Alta carga de escrituras

Disponibilidad

MapReduce

miércoles 25 de enero de 12

Orientadas a DocumentoEl documento es lo que importa

Almacenados en Colecciones

(bajo una clave)

Los documentos pueden ser heterogéneos

Formatos textuales: XML, YAML, JSON & BSON

Formatos binarios: P ej: PDFs

12(cc) Photo by Ampersand Duck - http://www.flickr.com/photos/ampersandduck/4941185476

miércoles 25 de enero de 12

Orientadas a DocumentoEl documento es lo que importa

Almacenados en Colecciones

(bajo una clave)

Los documentos pueden ser heterogéneos

Formatos textuales: XML, YAML, JSON & BSON

Formatos binarios: P ej: PDFs

12(cc) Photo by Ampersand Duck - http://www.flickr.com/photos/ampersandduck/4941185476

miércoles 25 de enero de 12

Key-Value

13

Basadas en:

Dynamo (paper de Amazon)

y Tablas Hash distribuidas

Colleción de pares clave-valor

Almacenados de forma distribuida

Útiles con:

muchas escrituras y lecturas pequeñas.

miércoles 25 de enero de 12

Key-Value

13

Basadas en:

Dynamo (paper de Amazon)

y Tablas Hash distribuidas

Colleción de pares clave-valor

Almacenados de forma distribuida

Útiles con:

muchas escrituras y lecturas pequeñas.

miércoles 25 de enero de 12

Orientadas a Grafos

14

Almacenan:

Nodos y relaciones

Ambos pueden contener pares clave-valor

Muy rápidos para consultas con operaciones sobre el gráfo(p. Ej: personas con un grado de afinidad 3)

miércoles 25 de enero de 12

Orientadas a Grafos

14

Almacenan:

Nodos y relaciones

Ambos pueden contener pares clave-valor

Muy rápidos para consultas con operaciones sobre el gráfo(p. Ej: personas con un grado de afinidad 3)

miércoles 25 de enero de 12

¿Cuándo utilizar NoSQL?Teorema CAP (Eric Brewer)

15Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12

¿Cuándo utilizar NoSQL?Teorema CAP (Eric Brewer)

15

CConsistency

Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12

¿Cuándo utilizar NoSQL?Teorema CAP (Eric Brewer)

15

C AConsistency Availability

Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12

¿Cuándo utilizar NoSQL?Teorema CAP (Eric Brewer)

15

C A

P

Consistency Availability

Partition Tolerance

Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12

¿Cuándo utilizar NoSQL?Teorema CAP (Eric Brewer)

15

C A

P

Consistency Availability

Partition Tolerance

Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12

¿Cuándo utilizar NoSQL?Teorema CAP (Eric Brewer)

15

C A

P

Consistency Availability

Partition Tolerance

Sólo 2

Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12

¿Cuándo utilizar NoSQL?Teorema CAP (Eric Brewer)

15

C A

P

Consistency Availability

Partition Tolerance

Sólo 2

Oracle, MySQL,

Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12

¿Cuándo utilizar NoSQL?Teorema CAP (Eric Brewer)

15

C A

P

Consistency Availability

Partition Tolerance

Sólo 2

Oracle, MySQL,

MongoDB, DataStore,

HyperTable, HBase

Redis, MemcacheDB

Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12

¿Cuándo utilizar NoSQL?Teorema CAP (Eric Brewer)

15

C A

P

Consistency Availability

Partition Tolerance

Sólo 2

Oracle, MySQL,

MongoDB, DataStore,

HyperTable, HBase

Redis, MemcacheDBDyn

amo,

Volde

mort,

Cas

sand

ra,

Sim

pleDB, C

ouch

DB, RiaK

RDBMSOrientadas a documento

orientadas a columnaKey-Value

Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12

NoSQL Document DB:MongoDB

16

miércoles 25 de enero de 12

MongoDB

17

Escrita en C++

Orientada a documento

Formato JSON (o BSON)

Un poco SQL (queries, índices, Referencias externas)

Particionado horizontal (sharding)

Consultas Javascript

Almacenamiento en GridFS

miércoles 25 de enero de 12

Orientadas a Documento

Documentos formateados en JSON

18

miércoles 25 de enero de 12

Orientadas a Documento

Documentos formateados en JSON

18

{ "_id" : { "$oid" : "4f13f2b98de23dc3d58f959a" }, "name" : "NoSQL y MongoDB", "presenter" : "David Gomez", "Event" : "decharlas", "duration" : 60, "timing" : { "start" : 17, "end" : 19 } }

miércoles 25 de enero de 12

Consultas

Utilizando un API y funciones JavaScript

19

miércoles 25 de enero de 12

beleriand:bin dgomez$ ./mongoMongoDB shell version: 1.8.1connecting to: test>

Consultas

Utilizando un API y funciones JavaScript

19

miércoles 25 de enero de 12

beleriand:bin dgomez$ ./mongoMongoDB shell version: 1.8.1connecting to: test>

Consultas

Utilizando un API y funciones JavaScript

19

beleriand:bin dgomez$ ./mongoMongoDB shell version: 1.8.1connecting to: test> use playgroundswitched to db playground>

miércoles 25 de enero de 12

beleriand:bin dgomez$ ./mongoMongoDB shell version: 1.8.1connecting to: test>

Consultas

Utilizando un API y funciones JavaScript

19

beleriand:bin dgomez$ ./mongoMongoDB shell version: 1.8.1connecting to: test> use playgroundswitched to db playground>

beleriand:bin dgomez$ ./mongoMongoDB shell version: 1.8.1connecting to: test> use playgroundswitched to db playground> db.talks.insert({'name' : 'codemotion', 'presenter' : 'David Gomez', 'Event' : 'decharlas' });>

miércoles 25 de enero de 12

beleriand:bin dgomez$ ./mongoMongoDB shell version: 1.8.1connecting to: test>

Consultas

Utilizando un API y funciones JavaScript

19

beleriand:bin dgomez$ ./mongoMongoDB shell version: 1.8.1connecting to: test> use playgroundswitched to db playground>

beleriand:bin dgomez$ ./mongoMongoDB shell version: 1.8.1connecting to: test> use playgroundswitched to db playground> db.talks.insert({'name' : 'codemotion', 'presenter' : 'David Gomez', 'Event' : 'decharlas' });>

beleriand:bin dgomez$ ./mongoMongoDB shell version: 1.8.1connecting to: test> use playgroundswitched to db playground> db.talks.insert({'name' : 'codemotion', 'presenter' : 'David Gomez', 'Event' : 'decharlas' });> db.talks.find();{ "_id" : ObjectId("4f13f7e5a00e6496e7a9541b"), "name" : "codemotion", "presenter" : "David Gomez", "Event" : "decharlas" }>

miércoles 25 de enero de 12

Colecciones

Equivalente a la tabla

Guardan documentos

No todos iguales

Pueden definir índices sobre atributos

Creadas con la primera inserción

Persistidas sobre un GridFS

20

miércoles 25 de enero de 12

Documentos

Identificados por un “_id” (generado o asignado)

Textual (JSON)

Binario (BSON)*

Documentos grandes divididos en chunks

21

miércoles 25 de enero de 12

Programación de clientes

Multitud de lenguajes (drivers)

Transformación a JSON realizada por el driver

22

miércoles 25 de enero de 12

Programación de clientes

Multitud de lenguajes (drivers)

Transformación a JSON realizada por el driver

22

{ "name" : "NoSQL y MongoDB", "presenter" : "David Gomez", "Event" : "decharlas", "duration" : 60, "timing" : { "start" : 17, "end" : 19 } }

sample.py

miércoles 25 de enero de 12

Programación de clientes

Multitud de lenguajes (drivers)

Transformación a JSON realizada por el driver

22

{ "name" : "NoSQL y MongoDB", "presenter" : "David Gomez", "Event" : "decharlas", "duration" : 60, "timing" : { "start" : 17, "end" : 19 } }

sample.py

{ "name" => "NoSQL y MongoDB", "presenter" => "David Gomez", "Event" => "decharlas", "duration" => 60, "timing" => { "start" => 17, "end" => 19 } }

Ruby

miércoles 25 de enero de 12

Programación de clientes

Multitud de lenguajes (drivers)

Transformación a JSON realizada por el driver

22

{ "name" : "NoSQL y MongoDB", "presenter" : "David Gomez", "Event" : "decharlas", "duration" : 60, "timing" : { "start" : 17, "end" : 19 } }

sample.py

{ "name" => "NoSQL y MongoDB", "presenter" => "David Gomez", "Event" => "decharlas", "duration" => 60, "timing" => { "start" => 17, "end" => 19 } }

Ruby

array( "name" => "NoSQL y MongoDB", "presenter" => "David Gomez", "Event" => "decharlas", "duration" => 60, "timing" => array( "start" => 17, "end" => 19 )}

sample.php

miércoles 25 de enero de 12

Programación de clientes

Multitud de lenguajes (drivers)

Transformación a JSON realizada por el driver

22

{ "name" : "NoSQL y MongoDB", "presenter" : "David Gomez", "Event" : "decharlas", "duration" : 60, "timing" : { "start" : 17, "end" : 19 } }

sample.py

{ "name" => "NoSQL y MongoDB", "presenter" => "David Gomez", "Event" => "decharlas", "duration" => 60, "timing" => { "start" => 17, "end" => 19 } }

Ruby

array( "name" => "NoSQL y MongoDB", "presenter" => "David Gomez", "Event" => "decharlas", "duration" => 60, "timing" => array( "start" => 17, "end" => 19 )}

sample.php

BasicDBObject doc = new BasicDBObject(); doc.put("name", "NoSQL y MongoDB"); doc.put("presenter", "David Gomez"); doc.put("Event", "decharlas"); doc.put("duration", 60);

BasicDBObject timing = new BasicDBObject(); timing.put("start", 17); timing.put("end", 19); doc.put("timing", timing);

sample.java

miércoles 25 de enero de 12

1. Obtener el Driver

Importar el driver

23

miércoles 25 de enero de 12

1. Obtener el Driver

Importar el driver

23

<dependency><groupId>org.mongodb</groupId><artifactId>mongo-java-driver</artifactId><version>2.7.0-rc1</version>

</dependency>

miércoles 25 de enero de 12

1. Obtener el Driver

Importar el driver

23

<dependency><groupId>org.mongodb</groupId><artifactId>mongo-java-driver</artifactId><version>2.7.0-rc1</version>

</dependency>

miércoles 25 de enero de 12

2. ConexiónObtener la referencia a la BD y la conexión

24

miércoles 25 de enero de 12

2. ConexiónObtener la referencia a la BD y la conexión

24

Mongo m = new Mongo( "127.0.0.1" , 27017 );

DB db = m.getDB( "playground" );

miércoles 25 de enero de 12

2. ConexiónObtener la referencia a la BD y la conexión

24

Mongo m = new Mongo( "127.0.0.1" , 27017 );

DB db = m.getDB( "playground" );

Sobre la BD se puede:

miércoles 25 de enero de 12

2. ConexiónObtener la referencia a la BD y la conexión

24

Mongo m = new Mongo( "127.0.0.1" , 27017 );

DB db = m.getDB( "playground" );

Sobre la BD se puede:Boolean authorized = db.authenticate(user, passwd);if (db.collectionExists("talks")) {

CommandResult cmdResult = db.command("{ collStats:"db.talks" , scale : 1 }");

} Set<String> colls = db.getCollectionNames();for (String s : colls) { System.out.println(s);}

miércoles 25 de enero de 12

3. Inserciones

Crear e insertar un objeto

25

miércoles 25 de enero de 12

3. Inserciones

Crear e insertar un objeto

25

BasicDBObject doc = new BasicDBObject(); doc.put("name", "NoSQL y MongoDB"); doc.put("presenter", "David Gomez"); doc.put("Event", "decharlas"); doc.put("duration", 60);

BasicDBObject timing = new BasicDBObject(); timing.put("start", 17); timing.put("end", 19); doc.put("timing", timing);

DBCollection coll = db.getCollection("talks"); coll.insert(doc);

miércoles 25 de enero de 12

4. Consultas (I)

Obtener todos los documentos de una colección

26

miércoles 25 de enero de 12

4. Consultas (I)

Obtener todos los documentos de una colección

26

DBCollection talks = db.getCollection("talks");

DBCursor cursor = talks.find();

while (cursor.hasNext()) { System.out.println(cursor.next()); }

miércoles 25 de enero de 12

4. Consultas (I)

Obtener todos los documentos de una colección

26

DBCollection talks = db.getCollection("talks");

DBCursor cursor = talks.find();

while (cursor.hasNext()) { System.out.println(cursor.next()); }

public abstract class DBCollection {

public final DBCursor find(){ public final DBCursor find( DBObject ref ) public final DBCursor find( DBObject ref , DBObject keys )

public final DBObject findOne( Object obj ) public final DBObject findOne( Object obj, DBObject fields )

public DBObject findAndModify( DBObject query , DBObject update )

}

miércoles 25 de enero de 12

4. Consultas (II)

Consultas “SQL-like”

27

miércoles 25 de enero de 12

4. Consultas (II)

Consultas “SQL-like”

27

SELECT * FROM TALKS WHERE PRESENTER = “David Gomez”;

Las consultas se hacen con Documentos JSON

miércoles 25 de enero de 12

4. Consultas (II)

Consultas “SQL-like”

27

SELECT * FROM TALKS WHERE PRESENTER = “David Gomez”;

{ “presenter” : “David Gomez” }

Las consultas se hacen con Documentos JSON

miércoles 25 de enero de 12

4. Consultas (II)

Consultas “SQL-like”

27

SELECT * FROM TALKS WHERE PRESENTER = “David Gomez”;

{ “presenter” : “David Gomez” }

Las consultas se hacen con Documentos JSON

beleriand:bin dgomez$ ./mongoMongoDB shell version: 1.8.1connecting to: test> use playgroundswitched to db playground> db.talks.find( { "presenter" : "David Gomez" });{ "_id" : ObjectId("4f13f7e5a00e6496e7a9541b"), "name" : "codemotion", "presenter" : "David Gomez", "Event" : "decharlas" }>

miércoles 25 de enero de 12

4. Consultas (II)

Consultas “SQL-like”

27

SELECT * FROM TALKS WHERE PRESENTER = “David Gomez”;

{ “presenter” : “David Gomez” }

Las consultas se hacen con Documentos JSON

beleriand:bin dgomez$ ./mongoMongoDB shell version: 1.8.1connecting to: test> use playgroundswitched to db playground> db.talks.find( { "presenter" : "David Gomez" });{ "_id" : ObjectId("4f13f7e5a00e6496e7a9541b"), "name" : "codemotion", "presenter" : "David Gomez", "Event" : "decharlas" }>

DBObject query = new BasicDBObject();query.put("presenter", "David Gomez"); DBCursor davidTalks = talks.find(query);while (davidTalks.hasNext()) { System.out.println(davidTalks.next());} }

miércoles 25 de enero de 12

4. Consultas (III)

Comparadores <, <=, >=, >, !=

28

miércoles 25 de enero de 12

4. Consultas (III)

Comparadores <, <=, >=, >, !=

28

SELECT * FROM TALKS WHERE duration < 60;

miércoles 25 de enero de 12

4. Consultas (III)

Comparadores <, <=, >=, >, !=

28

SELECT * FROM TALKS WHERE duration < 60;

{ “duration” : { $lt : 60} }{ “duration” : { $lte : 60} }{ “duration” : { $gt : 60} }{ “duration” : { $gte : 60} }{ “duration” : { $ne : 60} }

miércoles 25 de enero de 12

4. Consultas (III)

Comparadores <, <=, >=, >, !=

28

SELECT * FROM TALKS WHERE duration < 60;

{ “duration” : { $lt : 60} }{ “duration” : { $lte : 60} }{ “duration” : { $gt : 60} }{ “duration” : { $gte : 60} }{ “duration” : { $ne : 60} }

beleriand:bin dgomez$ ./mongoMongoDB shell version: 1.8.1connecting to: test> use playgroundswitched to db playground> > db.talks.find({"duration" : { $lt : 90 } }){ "_id" : ObjectId("4f1402f28de2930293c7cf8e"), "name" : "NoSQL y MongoDB", "presenter" : "David Gomez", "Event" : "decharlas", "duration" : 60, "timing" : { "start" : 17, "end" : 19 } }>

miércoles 25 de enero de 12

4. Consultas (III)

Comparadores <, <=, >=, >, !=

28

SELECT * FROM TALKS WHERE duration < 60;

{ “duration” : { $lt : 60} }{ “duration” : { $lte : 60} }{ “duration” : { $gt : 60} }{ “duration” : { $gte : 60} }{ “duration” : { $ne : 60} }

beleriand:bin dgomez$ ./mongoMongoDB shell version: 1.8.1connecting to: test> use playgroundswitched to db playground> > db.talks.find({"duration" : { $lt : 90 } }){ "_id" : ObjectId("4f1402f28de2930293c7cf8e"), "name" : "NoSQL y MongoDB", "presenter" : "David Gomez", "Event" : "decharlas", "duration" : 60, "timing" : { "start" : 17, "end" : 19 } }>

DBObject query = new BasicDBObject();query.put("duration", new BasicDBObject("$lt","90")); DBCursor shortTalks = talks.find(query);while (shortTalks.hasNext()) {

System.out.println(shortTalks.next());}

miércoles 25 de enero de 12

4. Consultas (IV)

Concatenación de consultas

29

miércoles 25 de enero de 12

4. Consultas (IV)

Concatenación de consultas

29

SELECT * FROM TALKS WHERE duration < 90 AND duration > 30;

miércoles 25 de enero de 12

4. Consultas (IV)

Concatenación de consultas

29

SELECT * FROM TALKS WHERE duration < 90 AND duration > 30;

{ “duration” : { $lt : 90, $gt : 60} }}

miércoles 25 de enero de 12

4. Consultas (IV)

Concatenación de consultas

29

SELECT * FROM TALKS WHERE duration < 90 AND duration > 30;

{ “duration” : { $lt : 90, $gt : 60} }}

DBObject query = new BasicDBObject();DBObject condition = new BasicDBObject("$lt", 90);condition.put("$gt",30);query.put("duration", condition); DBCursor shortTalks = talks.find(query);while (shortTalks.hasNext()) {

System.out.println(shortTalks.next());}

miércoles 25 de enero de 12

4. Consultas (V)

Otros operadores

30

miércoles 25 de enero de 12

4. Consultas (V)

Otros operadores

30

$all$exists$mod$ne$in$nin$nor$or$and$size$type

miércoles 25 de enero de 12

4. Consultas (y VI)

Concatenación de consultas

31

miércoles 25 de enero de 12

4. Consultas (y VI)

Concatenación de consultas

31

SELECT * FROM TALKS WHERE duration < 90 AND duration > 30AND (presenter = “David Gomez” or presenter=”Ricardo Borillo”);

miércoles 25 de enero de 12

4. Consultas (y VI)

Concatenación de consultas

31

SELECT * FROM TALKS WHERE duration < 90 AND duration > 30AND (presenter = “David Gomez” or presenter=”Ricardo Borillo”);

{ “duration” : { $lt : 90, $gt : 60}, $or : [ { “presenter” : “David Gomez”}, { “presenter” : “Ricardo Borillo”} ]}

miércoles 25 de enero de 12

4. Consultas (y VI)

Concatenación de consultas

31

SELECT * FROM TALKS WHERE duration < 90 AND duration > 30AND (presenter = “David Gomez” or presenter=”Ricardo Borillo”);

{ “duration” : { $lt : 90, $gt : 60}, $or : [ { “presenter” : “David Gomez”}, { “presenter” : “Ricardo Borillo”} ]}

DBObject query = new BasicDBObject();DBObject condition = new BasicDBObject("$lt",90);condition.put("$gt",30);query.put("duration", condition);

DBObject [] speakerCond = {new BasicDBObject("presenter", "David Gomez"), new BasicDBObject("presenter", "Ricardo Borillo")

};query.put("$or", speakerCond);

talks.find(query);

miércoles 25 de enero de 12

DBObjects desde JSON

32

com.mongo.util.JSON

miércoles 25 de enero de 12

DBObjects desde JSON

32

Object query = JSON.parse("{ 'duration' : { $lt : 90, $gt : 60}, " + " '$or' : [ { 'presenter' : 'David Gomez'}, " + " { 'presenter' : 'Ricardo Borillo'} ] }");

DBCursor cursor = db.find((DBObject) query);

com.mongo.util.JSON

miércoles 25 de enero de 12

Spring Data MongoDB

33

miércoles 25 de enero de 12

Spring Data

Objetivo:- Proporcionar un mecanismo homogeneo y

completo para el acceso a BD NoSQL

Multiples proyectos:- Soportados:

‣ MongoDB, Redis, Neo4j, Hadoop, GemFire, RiaK

- En proceso:‣ CouchDB, Hbase, Cassandra

34

miércoles 25 de enero de 12

Spring Data y MongoDB

XML namespace para configurar driver Mongo

MongoTemplate

Conversión automática de excepciones

OXM Configurable

JMX monitoring

35

miércoles 25 de enero de 12

Importando Spring Data

36

miércoles 25 de enero de 12

Importando Spring Data

36

<repository> <id>spring-milestone</id> <name>Spring Maven MILESTONE Repository</name> <url>http://maven.springframework.org/milestone</url></repository>

<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.0.0.RC1</version></dependency>

miércoles 25 de enero de 12

Namespace

37

miércoles 25 de enero de 12

Namespace

37

<?xml  version="1.0"  encoding="UTF-­‐8"?><beans  xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-­‐instance"     xmlns:mongo="http://www.springframework.org/schema/data/mongo"   xmlns:context="http://www.springframework.org/schema/context"   xsi:schemaLocation="http://www.springframework.org/schema/beans  

   http://www.springframework.org/schema/beans/spring-­‐beans.xsd            http://www.springframework.org/schema/data/mongo            http://www.springframework.org/schema/data/mongo/spring-­‐mongo-­‐1.0.xsd

         http://www.springframework.org/schema/context            http://www.springframework.org/schema/context/spring-­‐context.xsd">

</beans>

miércoles 25 de enero de 12

Namespace

37

<?xml  version="1.0"  encoding="UTF-­‐8"?><beans  xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-­‐instance"     xmlns:mongo="http://www.springframework.org/schema/data/mongo"   xmlns:context="http://www.springframework.org/schema/context"   xsi:schemaLocation="http://www.springframework.org/schema/beans  

   http://www.springframework.org/schema/beans/spring-­‐beans.xsd            http://www.springframework.org/schema/data/mongo            http://www.springframework.org/schema/data/mongo/spring-­‐mongo-­‐1.0.xsd

         http://www.springframework.org/schema/context            http://www.springframework.org/schema/context/spring-­‐context.xsd">

</beans>

<mongo:db-­‐factory  dbname="vts"/>

miércoles 25 de enero de 12

Namespace

37

<?xml  version="1.0"  encoding="UTF-­‐8"?><beans  xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-­‐instance"     xmlns:mongo="http://www.springframework.org/schema/data/mongo"   xmlns:context="http://www.springframework.org/schema/context"   xsi:schemaLocation="http://www.springframework.org/schema/beans  

   http://www.springframework.org/schema/beans/spring-­‐beans.xsd            http://www.springframework.org/schema/data/mongo            http://www.springframework.org/schema/data/mongo/spring-­‐mongo-­‐1.0.xsd

         http://www.springframework.org/schema/context            http://www.springframework.org/schema/context/spring-­‐context.xsd">

</beans>

<mongo:db-­‐factory  dbname="vts"/>

  <bean  id="mongoTemplate"  class="org.springframework.data.mongodb.core.MongoTemplate">     <constructor-­‐arg  name="mongoDbFactory"  ref="mongoDbFactory"  />   </bean>

miércoles 25 de enero de 12

MongoTemplate

38

Convierte query a JSON

Convierte respuesta (“_type”)

Gestiona las conexiones

Maneja las excepciones

  <bean  id="mongoTemplate"  class="org.springframework.data.mongodb.core.MongoTemplate">     <constructor-­‐arg  name="mongoDbFactory"  ref="mongoDbFactory"  />   </bean>

miércoles 25 de enero de 12

Repository

39

miércoles 25 de enero de 12

Repository

39

public  abstract  class  AbstractRepository<T>  {

  @Inject   protected  MongoTemplate  mongoTemplate;     /**  Clase  que  utiliza  Mongo  para  identificar  el  nombre  de  la  coleccion  */   private  Class<T>  persistentClass;

  protected  AbstractService(Class<T>  persistentClass)  {     this.persistentClass  =  persistentClass;   }

  public  List<T>  findAll(){     return  mongoTemplate.findAll(persistentClass);   }  

  public  void  save(T  e)  {     mongoTemplate.save(e);   }

  public  T  findById(String  id)  {     T  t  =  mongoTemplate.findById(id,  persistentClass);     if  (t  ==  null)  {       logger.debug(persistentClass.getSimpleName()  +  "  with  id  "  +  id  +  "  could  not  be  found");       throw  new  ObjectNotFoundException(persistentClass,  id);     }     return  t;   }

}

miércoles 25 de enero de 12

Consultas más sencillas

40

miércoles 25 de enero de 12

Consultas más sencillas

40

public  abstract  class  AbstractRepository<T>  {

  public  List<T>  getByType(String  type)  {     return  mongoTemplate.find(

new  Query(Criteria.where("type").is(type)),T.class,  persistentClass);

  }  

}

miércoles 25 de enero de 12

Conversión Manual

41

Porque a veces lo automático no funciona

miércoles 25 de enero de 12

Conversión Manual

41

Porque a veces lo automático no funcionapublic  class  BitSetReadConverter  implements  Converter<DBObject,  BitSet>  {

  @Override   public  BitSet  convert(DBObject  source)  {     BasicDBList  words  =  (BasicDBList)source.get("words");     BitSet  bitset  =  new  BitSet();     int  index  =  0;     for  (Object  word  :  words)  {       long  value  =  (Long)word;       while  (value  !=  0L)  {

      if  ((value  &  1L)  !=  0)  {                bitset.set(index);         }         ++index;         value  =  value  >>>  1;       }         }         return  bitset;   }}

miércoles 25 de enero de 12

Conversión Manual

42

Porque a veces lo automático no funciona

miércoles 25 de enero de 12

Conversión Manual

42

Porque a veces lo automático no funciona

<?xml  version="1.0"  encoding="UTF-­‐8"?><beans>

  <bean  id="mongoTemplate"  class="org.springframework.data.mongodb.core.MongoTemplate">     <constructor-­‐arg  name="mongoDbFactory"  ref="mongoDbFactory"  />     <constructor-­‐arg  name="mongoConverter"  ref="mappingConverter"  />   </bean>     <mongo:db-­‐factory  dbname="vts"/>     <mongo:mapping-­‐converter>     <mongo:custom-­‐converters>       <mongo:converter>         <bean  class="com.vts.db.BitSetReadConverter"/>       </mongo:converter>     </mongo:custom-­‐converters>   </mongo:mapping-­‐converter>

</beans>

miércoles 25 de enero de 12

Conclusiones

43

Reducción del número de tablas

Optimización en el rendimiento de escrituras

Simplificación de los DAOs con Spring-Data

Otras ventajas:

Documentos en formato de Respuesta REST

miércoles 25 de enero de 12

Q&A

44

miércoles 25 de enero de 12

45

miércoles 25 de enero de 12