nosql y mongodb
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-DataTRANSCRIPT
![Page 1: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/1.jpg)
Bases de datos NoSQL y MongoDBDavid Gómez
miércoles 25 de enero de 12
![Page 3: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/3.jpg)
Un vistazo a las soluciones NoSQL
3
miércoles 25 de enero de 12
![Page 4: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/4.jpg)
¿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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/5.jpg)
¿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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/6.jpg)
¿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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/7.jpg)
¿Qué es NoSQL?
Non Relational
Distributed
Horizontally scalable
5
miércoles 25 de enero de 12
![Page 8: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/8.jpg)
Motivaciones
6
miércoles 25 de enero de 12
![Page 9: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/9.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/10.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/11.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/12.jpg)
9
orientadas a Columna orientadas a Documento
orientadas a GrafosKey-value
Tipos
miércoles 25 de enero de 12
![Page 13: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/13.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/17.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/20.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/21.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/22.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/23.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/24.jpg)
¿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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/25.jpg)
¿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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/26.jpg)
¿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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/27.jpg)
¿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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/28.jpg)
¿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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/29.jpg)
¿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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/30.jpg)
¿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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/31.jpg)
¿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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/32.jpg)
¿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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/33.jpg)
NoSQL Document DB:MongoDB
16
miércoles 25 de enero de 12
![Page 34: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/34.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/35.jpg)
Orientadas a Documento
Documentos formateados en JSON
18
miércoles 25 de enero de 12
![Page 36: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/36.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/37.jpg)
Consultas
Utilizando un API y funciones JavaScript
19
miércoles 25 de enero de 12
![Page 38: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/38.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/39.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/40.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/41.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/42.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/43.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/44.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/45.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/46.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/47.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/48.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/49.jpg)
1. Obtener el Driver
Importar el driver
23
miércoles 25 de enero de 12
![Page 50: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/50.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/51.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/52.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/53.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/54.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/55.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/56.jpg)
3. Inserciones
Crear e insertar un objeto
25
miércoles 25 de enero de 12
![Page 57: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/57.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/58.jpg)
4. Consultas (I)
Obtener todos los documentos de una colección
26
miércoles 25 de enero de 12
![Page 59: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/59.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/60.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/61.jpg)
4. Consultas (II)
Consultas “SQL-like”
27
miércoles 25 de enero de 12
![Page 62: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/62.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/63.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/64.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/65.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/66.jpg)
4. Consultas (III)
Comparadores <, <=, >=, >, !=
28
miércoles 25 de enero de 12
![Page 67: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/67.jpg)
4. Consultas (III)
Comparadores <, <=, >=, >, !=
28
SELECT * FROM TALKS WHERE duration < 60;
miércoles 25 de enero de 12
![Page 68: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/68.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/69.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/70.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/71.jpg)
4. Consultas (IV)
Concatenación de consultas
29
miércoles 25 de enero de 12
![Page 72: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/72.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/73.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/74.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/75.jpg)
4. Consultas (V)
Otros operadores
30
miércoles 25 de enero de 12
![Page 76: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/76.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/77.jpg)
4. Consultas (y VI)
Concatenación de consultas
31
miércoles 25 de enero de 12
![Page 78: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/78.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/79.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/80.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/81.jpg)
DBObjects desde JSON
32
com.mongo.util.JSON
miércoles 25 de enero de 12
![Page 82: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/82.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/83.jpg)
Spring Data MongoDB
33
miércoles 25 de enero de 12
![Page 84: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/84.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/85.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/86.jpg)
Importando Spring Data
36
miércoles 25 de enero de 12
![Page 87: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/87.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/88.jpg)
Namespace
37
miércoles 25 de enero de 12
![Page 89: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/89.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/90.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/91.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/92.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/93.jpg)
Repository
39
miércoles 25 de enero de 12
![Page 94: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/94.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/95.jpg)
Consultas más sencillas
40
miércoles 25 de enero de 12
![Page 96: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/96.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/97.jpg)
Conversión Manual
41
Porque a veces lo automático no funciona
miércoles 25 de enero de 12
![Page 98: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/98.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/99.jpg)
Conversión Manual
42
Porque a veces lo automático no funciona
miércoles 25 de enero de 12
![Page 100: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/100.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/101.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/102.jpg)
Q&A
44
miércoles 25 de enero de 12
![Page 103: NoSql y MongoDB](https://reader033.vdocuments.site/reader033/viewer/2022052315/554f713bb4c905bb178b51eb/html5/thumbnails/103.jpg)
45
miércoles 25 de enero de 12