nosql y mongodb

103
Bases de datos NoSQL y MongoDB David Gómez miércoles 25 de enero de 12

Upload: david-gomez-garcia

Post on 10-May-2015

2.041 views

Category:

Business


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

Page 1: NoSql y MongoDB

Bases de datos NoSQL y MongoDBDavid Gómez

miércoles 25 de enero de 12

Page 3: NoSql y MongoDB

Un vistazo a las soluciones NoSQL

3

miércoles 25 de enero de 12

Page 4: NoSql y MongoDB

¿Qué es NoSQL?

4

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

miércoles 25 de enero de 12

Page 5: NoSql y MongoDB

¿Qué es NoSQL?

4

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

miércoles 25 de enero de 12

Page 6: NoSql y MongoDB

¿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

Page 7: NoSql y MongoDB

¿Qué es NoSQL?

Non Relational

Distributed

Horizontally scalable

5

miércoles 25 de enero de 12

Page 8: NoSql y MongoDB

Motivaciones

6

miércoles 25 de enero de 12

Page 9: NoSql y MongoDB

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

Page 10: NoSql y MongoDB

Características

Replicado (particionado horizontal)

Sin esquemas (versatibilidad, adaptabilidad)

BASE (not ACID)

7

miércoles 25 de enero de 12

Page 11: NoSql y MongoDB

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

Page 12: NoSql y MongoDB

9

orientadas a Columna orientadas a Documento

orientadas a GrafosKey-value

Tipos

miércoles 25 de enero de 12

Page 13: NoSql y MongoDB

Orientadas a columna

10

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

miércoles 25 de enero de 12

Page 14: NoSql y MongoDB

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

Page 15: NoSql y MongoDB

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

Page 16: NoSql y MongoDB

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

Page 17: NoSql y MongoDB

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

Page 18: NoSql y MongoDB

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

Page 19: NoSql y MongoDB

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

Page 20: NoSql y MongoDB

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

Page 21: NoSql y MongoDB

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

Page 22: NoSql y MongoDB

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

Page 23: NoSql y MongoDB

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

Page 24: NoSql y MongoDB

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

15Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12

Page 25: NoSql y MongoDB

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

15

CConsistency

Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12

Page 26: NoSql y MongoDB

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

15

C AConsistency Availability

Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12

Page 27: NoSql y MongoDB

¿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

Page 28: NoSql y MongoDB

¿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

Page 29: NoSql y MongoDB

¿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

Page 30: NoSql y MongoDB

¿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

Page 31: NoSql y MongoDB

¿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

Page 32: NoSql y MongoDB

¿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

Page 33: NoSql y MongoDB

NoSQL Document DB:MongoDB

16

miércoles 25 de enero de 12

Page 34: NoSql y MongoDB

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

Page 35: NoSql y MongoDB

Orientadas a Documento

Documentos formateados en JSON

18

miércoles 25 de enero de 12

Page 36: NoSql y MongoDB

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

Page 37: NoSql y MongoDB

Consultas

Utilizando un API y funciones JavaScript

19

miércoles 25 de enero de 12

Page 38: NoSql y MongoDB

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

Page 39: NoSql y MongoDB

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

Page 40: NoSql y MongoDB

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

Page 41: NoSql y MongoDB

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

Page 42: NoSql y MongoDB

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

Page 43: NoSql y MongoDB

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

Page 44: NoSql y MongoDB

Programación de clientes

Multitud de lenguajes (drivers)

Transformación a JSON realizada por el driver

22

miércoles 25 de enero de 12

Page 45: NoSql y MongoDB

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

Page 46: NoSql y MongoDB

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

Page 47: NoSql y MongoDB

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

Page 48: NoSql y MongoDB

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

Page 49: NoSql y MongoDB

1. Obtener el Driver

Importar el driver

23

miércoles 25 de enero de 12

Page 50: NoSql y MongoDB

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

Page 51: NoSql y MongoDB

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

Page 52: NoSql y MongoDB

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

24

miércoles 25 de enero de 12

Page 53: NoSql y MongoDB

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

Page 54: NoSql y MongoDB

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

Page 55: NoSql y MongoDB

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

Page 56: NoSql y MongoDB

3. Inserciones

Crear e insertar un objeto

25

miércoles 25 de enero de 12

Page 57: NoSql y MongoDB

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

Page 58: NoSql y MongoDB

4. Consultas (I)

Obtener todos los documentos de una colección

26

miércoles 25 de enero de 12

Page 59: NoSql y MongoDB

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

Page 60: NoSql y MongoDB

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

Page 61: NoSql y MongoDB

4. Consultas (II)

Consultas “SQL-like”

27

miércoles 25 de enero de 12

Page 62: NoSql y MongoDB

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

Page 63: NoSql y MongoDB

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

Page 64: NoSql y MongoDB

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

Page 65: NoSql y MongoDB

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

Page 66: NoSql y MongoDB

4. Consultas (III)

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

28

miércoles 25 de enero de 12

Page 67: NoSql y MongoDB

4. Consultas (III)

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

28

SELECT * FROM TALKS WHERE duration < 60;

miércoles 25 de enero de 12

Page 68: NoSql y MongoDB

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

Page 69: NoSql y MongoDB

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

Page 70: NoSql y MongoDB

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

Page 71: NoSql y MongoDB

4. Consultas (IV)

Concatenación de consultas

29

miércoles 25 de enero de 12

Page 72: NoSql y MongoDB

4. Consultas (IV)

Concatenación de consultas

29

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

miércoles 25 de enero de 12

Page 73: NoSql y MongoDB

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

Page 74: NoSql y MongoDB

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

Page 75: NoSql y MongoDB

4. Consultas (V)

Otros operadores

30

miércoles 25 de enero de 12

Page 76: NoSql y MongoDB

4. Consultas (V)

Otros operadores

30

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

miércoles 25 de enero de 12

Page 77: NoSql y MongoDB

4. Consultas (y VI)

Concatenación de consultas

31

miércoles 25 de enero de 12

Page 78: NoSql y MongoDB

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

Page 79: NoSql y MongoDB

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

Page 80: NoSql y MongoDB

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

Page 81: NoSql y MongoDB

DBObjects desde JSON

32

com.mongo.util.JSON

miércoles 25 de enero de 12

Page 82: NoSql y MongoDB

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

Page 83: NoSql y MongoDB

Spring Data MongoDB

33

miércoles 25 de enero de 12

Page 84: NoSql y MongoDB

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

Page 85: NoSql y MongoDB

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

Page 86: NoSql y MongoDB

Importando Spring Data

36

miércoles 25 de enero de 12

Page 87: NoSql y MongoDB

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

Page 88: NoSql y MongoDB

Namespace

37

miércoles 25 de enero de 12

Page 89: NoSql y MongoDB

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

Page 90: NoSql y MongoDB

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

Page 91: NoSql y MongoDB

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

Page 92: NoSql y MongoDB

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

Page 93: NoSql y MongoDB

Repository

39

miércoles 25 de enero de 12

Page 94: NoSql y MongoDB

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

Page 95: NoSql y MongoDB

Consultas más sencillas

40

miércoles 25 de enero de 12

Page 96: NoSql y MongoDB

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

Page 97: NoSql y MongoDB

Conversión Manual

41

Porque a veces lo automático no funciona

miércoles 25 de enero de 12

Page 98: NoSql y MongoDB

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

Page 99: NoSql y MongoDB

Conversión Manual

42

Porque a veces lo automático no funciona

miércoles 25 de enero de 12

Page 100: NoSql y MongoDB

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

Page 101: NoSql y MongoDB

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

Page 102: NoSql y MongoDB

Q&A

44

miércoles 25 de enero de 12

Page 103: NoSql y MongoDB

45

miércoles 25 de enero de 12