NoSql y MongoDB
-
Upload
david-gomez-garcia -
Category
Business
-
view
2.052 -
download
1
description
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