SlideShare una empresa de Scribd logo
1 de 103
Descargar para leer sin conexión
Bases de datos NoSQL y
         MongoDB
         David Gómez




miércoles 25 de enero de 12
David Gómez
                                     loper & Trainer
                              Deve           a-s istemas.
                                                         com
                              dgomez @extrem
                                              zg
                                     @dgome




                                                               2


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?



                                                   NoSQL !== no SQL
                                                     Not only SQL




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

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
Tipos




        orientadas a Columna        orientadas a Documento




                      Key-value       orientadas a Grafos
                                                             9


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
           Configuración individual de columnas por fila




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

miércoles 25 de enero de 12
Orientadas a columna
           Configuración individual de columnas por fila
          También conocidas como BigTable (google paper)




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

miércoles 25 de enero de 12
Orientadas a columna
           Configuración individual de columnas por fila
          También conocidas como BigTable (google paper)

                                                         Tamaño
                                       Alta carga de escrituras
                                                Disponibilidad
                                                    MapReduce


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

miércoles 25 de enero de 12
Orientadas a columna
           Configuración individual de columnas por fila
          También conocidas como BigTable (google paper)

                                                         Tamaño
                                       Alta carga de escrituras
                                                Disponibilidad
                                                    MapReduce


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

miércoles 25 de enero de 12
Orientadas a Documento
                              El 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 Documento
                              El 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
                               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.        13


miércoles 25 de enero de 12
Key-Value
                               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.        13


miércoles 25 de enero de 12
Orientadas a Grafos
                                   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)
                                                                                   14


miércoles 25 de enero de 12
Orientadas a Grafos
                                   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)
                                                                                   14


miércoles 25 de enero de 12
¿Cuándo utilizar NoSQL?
                              Teorema CAP (Eric Brewer)




                                                                                 15
                                                          Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12
¿Cuándo utilizar NoSQL?
                                 Teorema CAP (Eric Brewer)

                          Consistency

                              C




                                                                                    15
                                                             Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12
¿Cuándo utilizar NoSQL?
                                 Teorema CAP (Eric Brewer)

                          Consistency                  Availability

                              C                           A




                                                                                        15
                                                                 Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12
¿Cuándo utilizar NoSQL?
                                 Teorema CAP (Eric Brewer)

                          Consistency                         Availability

                              C                                  A



                                               P
                                        Partition Tolerance


                                                                                               15
                                                                        Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12
¿Cuándo utilizar NoSQL?
                                 Teorema CAP (Eric Brewer)

                          Consistency                         Availability

                              C                                  A



                                               P
                                        Partition Tolerance


                                                                                               15
                                                                        Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12
¿Cuándo utilizar NoSQL?
                                 Teorema CAP (Eric Brewer)

                          Consistency                         Availability

                              C                                  A
                                           Sólo
                                            2

                                               P
                                        Partition Tolerance


                                                                                               15
                                                                        Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12
¿Cuándo utilizar NoSQL?
                                 Teorema CAP (Eric Brewer)

                          Consistency                         Availability

                                                                 A
                                         Oracle, MySQL,
                              C
                                           Sólo
                                            2

                                               P
                                        Partition Tolerance


                                                                                               15
                                                                        Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12
¿Cuándo utilizar NoSQL?
                                   Teorema CAP (Eric Brewer)

                          Consistency                                   Availability

                                                                           A
                                                    Oracle, MySQL,
                              C
                                                        Sólo
                              M H yp i s,
                               on e M




                                                         2
                                 go rTa em
                                 Re


                                    DB ble ca
                                    d


                                        , D , H che
                                           at Ba DB
                                             aS s
                                               to e
                                                 re




                                                         P
                                                    ,




                                                  Partition Tolerance


                                                                                                         15
                                                                                  Source: Nathan Hurst’s Blog

miércoles 25 de enero de 12
¿Cuándo utilizar NoSQL?
                                   Teorema CAP (Eric Brewer)

                          Consistency                                            Availability

                                                                                     A
                                                    Oracle, MySQL,
                              C
                                                        Sólo
                              M H yp i s,




                                                                                  hD , rt,
                               on e M




                                                                                          aK
                                                         2



                                                                                uc ra o
                                 go rTa em




                                                                              Co and dem
                                 Re




                                                                                       Ri
                                    DB ble ca
                                    d




                                                                                    B,
                                                                            B, ss ol
                                        , D , H che




                                                                          eD a , V
                                           at Ba DB




                                                                        pl C mo
                                             aS s




                                                                             na
                                               to e




                                                                   Dy
                                                 re




                                                         P
                                                    ,




                                                                         m
                                                                                         RDBMS
                                                                        Si       Orientadas a documento
                                                  Partition Tolerance             orientadas a columna
                                                                                        Key-Value
                                                                                                                  15
                                                                                           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

                                       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
                                                                   17


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
                                {
                                	       "_id" : {
                                	       	    "$oid" : "4f13f2b98de23dc3d58f959a"
                                	       },
                                    	   "name" : "NoSQL y MongoDB",
                                    	   "presenter" : "David Gomez",
                                    	   "Event" : "decharlas",
                                    	   "duration" : 60,
                                    	   "timing" : {
                                	         	  "start" : 17,
                                	         	  "end" : 19
                                	         }
                                }




                                                                                   18


miércoles 25 de enero de 12
Consultas

                         Utilizando un API y funciones JavaScript




                                                                    19


miércoles 25 de enero de 12
Consultas

                         Utilizando un API y funciones JavaScript
            beleriand:bin dgomez$ ./mongo
            MongoDB shell version: 1.8.1
            connecting to: test
            >




                                                                    19


miércoles 25 de enero de 12
Consultas

                         Utilizando un API y funciones JavaScript
            beleriand:bin dgomez$ ./mongo
            MongoDB shell version: 1.8.1
            connecting to: test
            > use playground
            switched to db playground
            >




                                                                    19


miércoles 25 de enero de 12
Consultas

                         Utilizando un API y funciones JavaScript
            beleriand:bin dgomez$ ./mongo
            MongoDB shell version: 1.8.1
            connecting to: test
            > use playground
            switched to db playground
            > db.talks.insert({'name' : 'codemotion', 'presenter' : 'David Gomez', 'Event' :
            'decharlas' });
            >




                                                                                               19


miércoles 25 de enero de 12
Consultas

                         Utilizando un API y funciones JavaScript
            beleriand:bin dgomez$ ./mongo
            MongoDB shell version: 1.8.1
            connecting to: test
            > use playground
            switched 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" }
            >




                                                                                                   19


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

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

                                                   sample.py

                                                                   22


miércoles 25 de enero de 12
Programación de clientes

                              Multitud de lenguajes (drivers)
                   Transformación a JSON realizada por el driver

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

                                                 sample.py    Ruby

                                                                     22


miércoles 25 de enero de 12
Programación de clientes

                              Multitud de lenguajes (drivers)
                   Transformación a JSON realizada por el driver

              {           {
                                        array( "name" => "NoSQL y MongoDB",
               	    "name" : "NoSQL y MongoDB", y MongoDB",
                                 "name" => "NoSQL
                                         	 "presenter" => "David Gomez",
               	    "presenter" : "David Gomez",
                            	 "presenter" => "David Gomez",
                                         	 "Event" => "decharlas",
               	    "Event" 	: "decharlas",
                                "Event" => "decharlas",
                                         	 "duration" => 60,
               	    "duration" "duration" => 60,
                            	   : 60,
                                         	 "timing" => array(
               	    "timing" : "timing" => {
                            	   {
                                        	    	 "start" => 17,
              	      	 "start" 	: 17,
                          	          "start" => 17,
                                        	    	 "end" => 19
              	      	 "end" : 	19 "end" => 19
                          	
                                        	    )
              	      }    	      }
                                        }
              }           }
                                                                         sample.php
                                                    sample.py      Ruby

                                                                                      22


miércoles 25 de enero de 12
Programación de clientes

                              Multitud de lenguajes (drivers)
                   Transformación a JSON realizada por el driver

                                                    BasicDBObject doc = new BasicDBObject();
              {           {
                                        array( "name" => "NoSQL y MongoDB", y MongoDB");
                                                     doc.put("name", "NoSQL
               	    "name" : "NoSQL y MongoDB", y MongoDB",
                                 "name" => "NoSQL
                                         	 "presenter" => "David Gomez", "David Gomez");
                                                     doc.put("presenter",
               	    "presenter" : "David Gomez",
                            	 "presenter" => "David Gomez",
                                         	 "Event" => "decharlas",
                                                     doc.put("Event", "decharlas");
               	    "Event" 	: "decharlas",
                                "Event" => "decharlas",
                                                     doc.put("duration", 60);
                                         	 "duration" => 60,
               	    "duration" "duration" => 60,
                            	   : 60,
                                         	 "timing" => array(
               	    "timing" : "timing" => {
                            	   {
                                        	            BasicDBObject timing = new BasicDBObject();
                                             	 "start" => 17,
              	      	 "start" 	: 17,
                          	          "start" => 17,
                                        	    	 "end"timing.put("start", 17);
                                                      => 19
              	      	 "end" : 	19 "end" => 19
                          	
                                        	    )       timing.put("end", 19);
              	      }    	      }
                                        }            doc.put("timing", timing);
              }           }
                                                                         sample.php
                                                    sample.py      Ruby
                                                                                      sample.java
                                                                                                    22


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

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




                                                                       23


miércoles 25 de enero de 12
1. Obtener el Driver

                                         Importar el driver

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




                                                                       23


miércoles 25 de enero de 12
2. Conexión
                    Obtener la referencia a la BD y la conexión




                                                                  24


miércoles 25 de enero de 12
2. Conexión
                    Obtener la referencia a la BD y la conexión
                              	
                                  Mongo m = new Mongo( "127.0.0.1" , 27017 );
                              	   DB db = m.getDB( "playground" );
                              	   	




                                                                                24


miércoles 25 de enero de 12
2. Conexión
                    Obtener la referencia a la BD y la conexión
                              	
                                  Mongo m = new Mongo( "127.0.0.1" , 27017 );
                              	   DB db = m.getDB( "playground" );
                              	   	



                                      Sobre la BD se puede:




                                                                                24


miércoles 25 de enero de 12
2. Conexión
                    Obtener la referencia a la BD y la conexión
                              	
                                  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);
                          }	 	
                                                                                  24


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
                              	       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);

                              	   	



                                                                                       25


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
                              DBCollection talks = db.getCollection("talks");

                              DBCursor cursor = talks.find();

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




                                                                                26


miércoles 25 de enero de 12
4. Consultas (I)

             Obtener todos los documentos de una colección
                              DBCollection talks = db.getCollection("talks");

                              DBCursor cursor = talks.find();
                                public abstract class DBCollection {
                              while (cursor.hasNext()) {
                              	    public final DBCursor find(){
                               System.out.println(cursor.next());
                              }    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 )

                               }



                                                                                                   26


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”
                              SELECT * FROM TALKS WHERE PRESENTER = “David Gomez”;


               Las consultas se hacen con Documentos JSON




                                                                                     27


miércoles 25 de enero de 12
4. Consultas (II)

                                       Consultas “SQL-like”
                              SELECT * FROM TALKS WHERE PRESENTER = “David Gomez”;


               Las consultas se hacen con Documentos JSON
                                       { “presenter” : “David Gomez” }




                                                                                     27


miércoles 25 de enero de 12
4. Consultas (II)

                                       Consultas “SQL-like”
                              SELECT * FROM TALKS WHERE PRESENTER = “David Gomez”;


               Las consultas se hacen con Documentos JSON
                                       { “presenter” : “David Gomez” }


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



                                                                                     27


miércoles 25 de enero de 12
4. Consultas (II)

                                       Consultas “SQL-like”
                              SELECT * FROM TALKS WHERE PRESENTER = “David Gomez”;


               Las consultas se hacen con Documentos JSON
                                       { “presenter” : “David Gomez” }


           beleriand:bin dgomez$ ./mongo
           MongoDB shell version: 1.8.1
                                 DBObject query = new BasicDBObject();
           connecting to: test
                                 query.put("presenter", "David Gomez");
           > use playground
           switched to db playground
                                 DBCursor davidTalks = talks.find(query);
           > db.talks.find( { "presenter" : "David Gomez" });
                                 while (davidTalks.hasNext()) {
           { "_id" : ObjectId("4f13f7e5a00e6496e7a9541b"), "name" : "codemotion",
                                   	 System.out.println(davidTalks.next());
           "presenter" : "David Gomez", "Event" : "decharlas" }
                                 }
           >
                                 	    }


                                                                                     27


miércoles 25 de enero de 12
4. Consultas (III)
                              Comparadores <, <=, >=, >, !=




                                                              28


miércoles 25 de enero de 12
4. Consultas (III)
                                 Comparadores <, <=, >=, >, !=
                              SELECT * FROM TALKS WHERE duration < 60;




                                                                         28


miércoles 25 de enero de 12
4. Consultas (III)
                                 Comparadores <, <=, >=, >, !=
                              SELECT * FROM TALKS WHERE duration < 60;

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




                                                                                28


miércoles 25 de enero de 12
4. Consultas (III)
                                 Comparadores <, <=, >=, >, !=
                              SELECT * FROM TALKS WHERE duration < 60;

                                        {   “duration”   :   {   $lt : 60} }
                                        {   “duration”   :   {   $lte : 60} }
                                        {   “duration”   :   {   $gt : 60} }
                                        {   “duration”   :   {   $gte : 60} }
                                        {   “duration”   :   {   $ne : 60} }
           beleriand:bin dgomez$ ./mongo
           MongoDB shell version: 1.8.1
           connecting to: test
           > use playground
           switched 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 } }
           >


                                                                                             28


miércoles 25 de enero de 12
4. Consultas (III)
                                 Comparadores <, <=, >=, >, !=
                              SELECT * FROM TALKS WHERE duration < 60;

                                        {   “duration”   :   {   $lt : 60} }
                                        {   “duration”   :   {   $lte : 60} }
                                        {   “duration”   :   {   $gt : 60} }
                                        {   “duration”   :   {   $gte : 60} }
                                        {   “duration”   :   {   $ne : 60} }
           beleriand:bin dgomez$ ./mongo
           MongoDB shell version: 1.8.1
           connecting to: test
           > use playground
           switched to db playground    DBObject query = new BasicDBObject();
                                        query.put("duration", new BasicDBObject("$lt","90"));
           > > db.talks.find({"duration" : { $lt : 90 } })
           { "_id" : ObjectId("4f1402f28de2930293c7cf8e"), "name" : "NoSQL y MongoDB",
           "presenter" : "David Gomez", DBCursor :shortTalks = talks.find(query);
                                         "Event"   "decharlas", "duration" : 60, "timing" :
           { "start" : 17, "end" : 19 } while (shortTalks.hasNext()) {
                                         }
           >                                 System.out.println(shortTalks.next());
                                            }
                                                                                                28


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
                              SELECT * FROM TALKS WHERE duration < 90 AND duration > 30;




                                                                                           29


miércoles 25 de enero de 12
4. Consultas (IV)
                                   Concatenación de consultas
                              SELECT * FROM TALKS WHERE duration < 90 AND duration > 30;


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




                                                                                           29


miércoles 25 de enero de 12
4. Consultas (IV)
                                   Concatenación de consultas
                              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());
                              }




                                                                                           29


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
                                      $all
                                      $exists
                                      $mod
                                      $ne
                                      $in
                                      $nin
                                      $nor
                                      $or
                                      $and
                                      $size
                                      $type




                                                    30


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
                    SELECT * FROM TALKS WHERE duration < 90 AND duration > 30
                         AND (presenter = “David Gomez” or presenter=”Ricardo Borillo”);




                                                                                           31


miércoles 25 de enero de 12
4. Consultas (y VI)
                                Concatenación de consultas
                    SELECT * FROM TALKS WHERE duration < 90 AND duration > 30
                         AND (presenter = “David Gomez” or presenter=”Ricardo Borillo”);

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




                                                                                           31


miércoles 25 de enero de 12
4. Consultas (y VI)
                                 Concatenación de consultas
                    SELECT * FROM TALKS WHERE duration < 90 AND duration > 30
                         AND (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);
                                                                                           31
                              talks.find(query);

miércoles 25 de enero de 12
DBObjects desde JSON
                              com.mongo.util.JSON




                                                    32


miércoles 25 de enero de 12
DBObjects desde JSON
                                    com.mongo.util.JSON

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

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




                                                                                          32


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

                        <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>




                                                                                      36


miércoles 25 de enero de 12
Namespace




                                          37


miércoles 25 de enero de 12
Namespace

           <?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>



                                                                                                                 37


miércoles 25 de enero de 12
Namespace

           <?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">

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




           </beans>



                                                                                                                 37


miércoles 25 de enero de 12
Namespace

                <?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">

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


                </beans>



                                                                                                                      37


miércoles 25 de enero de 12
MongoTemplate
          	
     <bean	
  id="mongoTemplate"	
  class="org.springframework.data.mongodb.core.MongoTemplate">
          	
     	
   <constructor-­‐arg	
  name="mongoDbFactory"	
  ref="mongoDbFactory"	
  />
          	
     </bean>




                                 Convierte query a JSON
                              Convierte respuesta (“_type”)
                                   Gestiona las conexiones
                                   Maneja las excepciones



                                                                                                               38


miércoles 25 de enero de 12
Repository




                                           39


miércoles 25 de enero de 12
Repository
      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;
      	
     }

      }

                                                                                                                                                                     39


miércoles 25 de enero de 12
Consultas más sencillas




                                                40


miércoles 25 de enero de 12
Consultas más sencillas
        public	
  abstract	
  class	
  AbstractRepository<T>	
  {

        	
     public	
  List<T>	
  getByType(String	
  type)	
  {
        	
     	
    return	
  mongoTemplate.find(
                           new	
  Query(Criteria.where("type").is(type)),
                           T.class,	
  persistentClass);
        	
     }	
  


        }




                                                                            40


miércoles 25 de enero de 12
Conversión Manual
                          Porque a veces lo automático no funciona




                                                                     41


miércoles 25 de enero de 12
Conversión Manual
                          Porque a veces lo automático no funciona
                public	
  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;
                	
     }
                }


                                                                                                              41


miércoles 25 de enero de 12
Conversión Manual
                          Porque a veces lo automático no funciona




                                                                     42


miércoles 25 de enero de 12
Conversión Manual
                          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>




                                                                                                                42


miércoles 25 de enero de 12
Conclusiones

                              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


                                                               43


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

Más contenido relacionado

Destacado (9)

Introducción al mundo NoSQL
Introducción al mundo NoSQLIntroducción al mundo NoSQL
Introducción al mundo NoSQL
 
Un acercamiento a las bases de datos NoSQL
Un acercamiento a las bases de datos NoSQLUn acercamiento a las bases de datos NoSQL
Un acercamiento a las bases de datos NoSQL
 
MongoDB: la BBDD NoSQL más popular del mercado
MongoDB: la BBDD NoSQL más popular del mercadoMongoDB: la BBDD NoSQL más popular del mercado
MongoDB: la BBDD NoSQL más popular del mercado
 
Bd no sql conceptos basicos
Bd no sql conceptos basicosBd no sql conceptos basicos
Bd no sql conceptos basicos
 
NoSQL: Introducción a las Bases de Datos no estructuradas
NoSQL: Introducción a las Bases de Datos no estructuradasNoSQL: Introducción a las Bases de Datos no estructuradas
NoSQL: Introducción a las Bases de Datos no estructuradas
 
Graficos de control
Graficos de controlGraficos de control
Graficos de control
 
Bd nosql clave valor
Bd nosql clave valorBd nosql clave valor
Bd nosql clave valor
 
Bd no sql tecnicas2
Bd no sql tecnicas2Bd no sql tecnicas2
Bd no sql tecnicas2
 
Bd no sq ldocumento
Bd no sq ldocumentoBd no sq ldocumento
Bd no sq ldocumento
 

Más de David Gómez García

Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022David Gómez García
 
Building Modular monliths that could scale to microservices (only if they nee...
Building Modular monliths that could scale to microservices (only if they nee...Building Modular monliths that could scale to microservices (only if they nee...
Building Modular monliths that could scale to microservices (only if they nee...David Gómez García
 
Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...David Gómez García
 
Leveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results AsynchrhonouslyLeveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results AsynchrhonouslyDavid Gómez García
 
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021David Gómez García
 
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integrationCdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integrationDavid Gómez García
 
What's in a community like Liferay's
What's in a community like Liferay'sWhat's in a community like Liferay's
What's in a community like Liferay'sDavid Gómez García
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadDavid Gómez García
 
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTRT3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTRDavid Gómez García
 
Managing user's data with Spring Session
Managing user's data with Spring SessionManaging user's data with Spring Session
Managing user's data with Spring SessionDavid Gómez García
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradleDavid Gómez García
 
Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.David Gómez García
 
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)David Gómez García
 
Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min. Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min. David Gómez García
 
El poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesaníaEl poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesaníaDavid Gómez García
 
HDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript ScriptingHDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript ScriptingDavid Gómez García
 

Más de David Gómez García (20)

Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022
 
Building Modular monliths that could scale to microservices (only if they nee...
Building Modular monliths that could scale to microservices (only if they nee...Building Modular monliths that could scale to microservices (only if they nee...
Building Modular monliths that could scale to microservices (only if they nee...
 
Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...
 
Leveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results AsynchrhonouslyLeveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results Asynchrhonously
 
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
 
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integrationCdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
 
What's in a community like Liferay's
What's in a community like Liferay'sWhat's in a community like Liferay's
What's in a community like Liferay's
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidad
 
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTRT3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
 
Managing user's data with Spring Session
Managing user's data with Spring SessionManaging user's data with Spring Session
Managing user's data with Spring Session
 
Parallel streams in java 8
Parallel streams in java 8Parallel streams in java 8
Parallel streams in java 8
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradle
 
Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.
 
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
 
Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min. Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min.
 
Spring4 whats up doc?
Spring4 whats up doc?Spring4 whats up doc?
Spring4 whats up doc?
 
Gradle como alternativa a maven
Gradle como alternativa a mavenGradle como alternativa a maven
Gradle como alternativa a maven
 
El poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesaníaEl poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesanía
 
Geo-SentimentZ
Geo-SentimentZGeo-SentimentZ
Geo-SentimentZ
 
HDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript ScriptingHDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript Scripting
 

Último

T.A- CONTRUCCION DEL PUERTO DE CHANCAY.pdf
T.A- CONTRUCCION DEL PUERTO DE CHANCAY.pdfT.A- CONTRUCCION DEL PUERTO DE CHANCAY.pdf
T.A- CONTRUCCION DEL PUERTO DE CHANCAY.pdfLizCarolAmasifuenIba
 
PPT Empresas IANSA Sobre Recursos Humanos.pdf
PPT Empresas IANSA Sobre Recursos Humanos.pdfPPT Empresas IANSA Sobre Recursos Humanos.pdf
PPT Empresas IANSA Sobre Recursos Humanos.pdfihmorales
 
AFILIACION CAJA NACIONAL DE SALUD WOM 1 .pdf
AFILIACION CAJA NACIONAL DE SALUD WOM 1 .pdfAFILIACION CAJA NACIONAL DE SALUD WOM 1 .pdf
AFILIACION CAJA NACIONAL DE SALUD WOM 1 .pdfOdallizLucanaJalja1
 
Gastos que no forman parte del Valor en Aduana de la mercadería importada
Gastos que no forman parte del Valor en Aduana de la mercadería importadaGastos que no forman parte del Valor en Aduana de la mercadería importada
Gastos que no forman parte del Valor en Aduana de la mercadería importadaInstituto de Capacitacion Aduanera
 
15. NORMATIVA DE SST - LA LEY 29783.pptx
15. NORMATIVA DE SST - LA LEY 29783.pptx15. NORMATIVA DE SST - LA LEY 29783.pptx
15. NORMATIVA DE SST - LA LEY 29783.pptxAndreaAlessandraBoli
 
¿ESTÁ PREPARADA LA LOGÍSTICA PARA EL DECRECIMIENTO?
¿ESTÁ PREPARADA LA LOGÍSTICA PARA EL DECRECIMIENTO?¿ESTÁ PREPARADA LA LOGÍSTICA PARA EL DECRECIMIENTO?
¿ESTÁ PREPARADA LA LOGÍSTICA PARA EL DECRECIMIENTO?Michael Rada
 
PRESENTACIÓN NOM-004-STPS-2020 SEGURIDAD EN MAQUINARIA
PRESENTACIÓN NOM-004-STPS-2020 SEGURIDAD EN MAQUINARIAPRESENTACIÓN NOM-004-STPS-2020 SEGURIDAD EN MAQUINARIA
PRESENTACIÓN NOM-004-STPS-2020 SEGURIDAD EN MAQUINARIAgisellgarcia92
 
La electrónica y electricidad finall.pdf
La electrónica y electricidad finall.pdfLa electrónica y electricidad finall.pdf
La electrónica y electricidad finall.pdfDiegomauricioMedinam
 
T.A CONSTRUCCION DEL PUERTO DE CHANCAY.pptx
T.A CONSTRUCCION DEL PUERTO DE CHANCAY.pptxT.A CONSTRUCCION DEL PUERTO DE CHANCAY.pptx
T.A CONSTRUCCION DEL PUERTO DE CHANCAY.pptxLizCarolAmasifuenIba
 
BLOQUE I HISTOLOGIA segundo año medicina Primer bloque primer parcial
BLOQUE I HISTOLOGIA segundo año medicina Primer bloque primer parcialBLOQUE I HISTOLOGIA segundo año medicina Primer bloque primer parcial
BLOQUE I HISTOLOGIA segundo año medicina Primer bloque primer parcial2811436330101
 
Rendicion de cuentas del Administrador de Condominios
Rendicion de cuentas del Administrador de CondominiosRendicion de cuentas del Administrador de Condominios
Rendicion de cuentas del Administrador de CondominiosCondor Tuyuyo
 
Proyecto TRIBUTACION APLICADA-1.pdf impuestos nacionales
Proyecto TRIBUTACION APLICADA-1.pdf impuestos nacionalesProyecto TRIBUTACION APLICADA-1.pdf impuestos nacionales
Proyecto TRIBUTACION APLICADA-1.pdf impuestos nacionalesjimmyrocha6
 
EL CAMBIO PLANEADO todo acerca de cambio .pptx
EL CAMBIO PLANEADO todo acerca de cambio .pptxEL CAMBIO PLANEADO todo acerca de cambio .pptx
EL CAMBIO PLANEADO todo acerca de cambio .pptxec677944
 
Elección supervisor y comité SST 2020.pptx
Elección supervisor y comité SST 2020.pptxElección supervisor y comité SST 2020.pptx
Elección supervisor y comité SST 2020.pptxDiegoQuispeHuaman
 
CADENA DE SUMINISTROS DIAPOSITIVASS.pptx
CADENA DE SUMINISTROS DIAPOSITIVASS.pptxCADENA DE SUMINISTROS DIAPOSITIVASS.pptx
CADENA DE SUMINISTROS DIAPOSITIVASS.pptxYesseniaGuzman7
 
Administración en nuestra vida cotidiana .pdf
Administración en nuestra vida cotidiana .pdfAdministración en nuestra vida cotidiana .pdf
Administración en nuestra vida cotidiana .pdfec677944
 
Derechos de propiedad intelectual lo mejor
Derechos de propiedad intelectual lo mejorDerechos de propiedad intelectual lo mejor
Derechos de propiedad intelectual lo mejorMarcosAlvarezSalinas
 
20240418-CambraSabadell-SesInf-AdopTecnologica-CasoPractico.pdf
20240418-CambraSabadell-SesInf-AdopTecnologica-CasoPractico.pdf20240418-CambraSabadell-SesInf-AdopTecnologica-CasoPractico.pdf
20240418-CambraSabadell-SesInf-AdopTecnologica-CasoPractico.pdfRamon Costa i Pujol
 
PLANILLA DE CONTROL LIMPIEZA TRAMPA DE GRASA
PLANILLA DE CONTROL LIMPIEZA TRAMPA DE GRASAPLANILLA DE CONTROL LIMPIEZA TRAMPA DE GRASA
PLANILLA DE CONTROL LIMPIEZA TRAMPA DE GRASAAlexandraSalgado28
 
Mapa Conceptual relacionado con la Gerencia Industrial, su ámbito de aplicaci...
Mapa Conceptual relacionado con la Gerencia Industrial, su ámbito de aplicaci...Mapa Conceptual relacionado con la Gerencia Industrial, su ámbito de aplicaci...
Mapa Conceptual relacionado con la Gerencia Industrial, su ámbito de aplicaci...antonellamujica
 

Último (20)

T.A- CONTRUCCION DEL PUERTO DE CHANCAY.pdf
T.A- CONTRUCCION DEL PUERTO DE CHANCAY.pdfT.A- CONTRUCCION DEL PUERTO DE CHANCAY.pdf
T.A- CONTRUCCION DEL PUERTO DE CHANCAY.pdf
 
PPT Empresas IANSA Sobre Recursos Humanos.pdf
PPT Empresas IANSA Sobre Recursos Humanos.pdfPPT Empresas IANSA Sobre Recursos Humanos.pdf
PPT Empresas IANSA Sobre Recursos Humanos.pdf
 
AFILIACION CAJA NACIONAL DE SALUD WOM 1 .pdf
AFILIACION CAJA NACIONAL DE SALUD WOM 1 .pdfAFILIACION CAJA NACIONAL DE SALUD WOM 1 .pdf
AFILIACION CAJA NACIONAL DE SALUD WOM 1 .pdf
 
Gastos que no forman parte del Valor en Aduana de la mercadería importada
Gastos que no forman parte del Valor en Aduana de la mercadería importadaGastos que no forman parte del Valor en Aduana de la mercadería importada
Gastos que no forman parte del Valor en Aduana de la mercadería importada
 
15. NORMATIVA DE SST - LA LEY 29783.pptx
15. NORMATIVA DE SST - LA LEY 29783.pptx15. NORMATIVA DE SST - LA LEY 29783.pptx
15. NORMATIVA DE SST - LA LEY 29783.pptx
 
¿ESTÁ PREPARADA LA LOGÍSTICA PARA EL DECRECIMIENTO?
¿ESTÁ PREPARADA LA LOGÍSTICA PARA EL DECRECIMIENTO?¿ESTÁ PREPARADA LA LOGÍSTICA PARA EL DECRECIMIENTO?
¿ESTÁ PREPARADA LA LOGÍSTICA PARA EL DECRECIMIENTO?
 
PRESENTACIÓN NOM-004-STPS-2020 SEGURIDAD EN MAQUINARIA
PRESENTACIÓN NOM-004-STPS-2020 SEGURIDAD EN MAQUINARIAPRESENTACIÓN NOM-004-STPS-2020 SEGURIDAD EN MAQUINARIA
PRESENTACIÓN NOM-004-STPS-2020 SEGURIDAD EN MAQUINARIA
 
La electrónica y electricidad finall.pdf
La electrónica y electricidad finall.pdfLa electrónica y electricidad finall.pdf
La electrónica y electricidad finall.pdf
 
T.A CONSTRUCCION DEL PUERTO DE CHANCAY.pptx
T.A CONSTRUCCION DEL PUERTO DE CHANCAY.pptxT.A CONSTRUCCION DEL PUERTO DE CHANCAY.pptx
T.A CONSTRUCCION DEL PUERTO DE CHANCAY.pptx
 
BLOQUE I HISTOLOGIA segundo año medicina Primer bloque primer parcial
BLOQUE I HISTOLOGIA segundo año medicina Primer bloque primer parcialBLOQUE I HISTOLOGIA segundo año medicina Primer bloque primer parcial
BLOQUE I HISTOLOGIA segundo año medicina Primer bloque primer parcial
 
Rendicion de cuentas del Administrador de Condominios
Rendicion de cuentas del Administrador de CondominiosRendicion de cuentas del Administrador de Condominios
Rendicion de cuentas del Administrador de Condominios
 
Proyecto TRIBUTACION APLICADA-1.pdf impuestos nacionales
Proyecto TRIBUTACION APLICADA-1.pdf impuestos nacionalesProyecto TRIBUTACION APLICADA-1.pdf impuestos nacionales
Proyecto TRIBUTACION APLICADA-1.pdf impuestos nacionales
 
EL CAMBIO PLANEADO todo acerca de cambio .pptx
EL CAMBIO PLANEADO todo acerca de cambio .pptxEL CAMBIO PLANEADO todo acerca de cambio .pptx
EL CAMBIO PLANEADO todo acerca de cambio .pptx
 
Elección supervisor y comité SST 2020.pptx
Elección supervisor y comité SST 2020.pptxElección supervisor y comité SST 2020.pptx
Elección supervisor y comité SST 2020.pptx
 
CADENA DE SUMINISTROS DIAPOSITIVASS.pptx
CADENA DE SUMINISTROS DIAPOSITIVASS.pptxCADENA DE SUMINISTROS DIAPOSITIVASS.pptx
CADENA DE SUMINISTROS DIAPOSITIVASS.pptx
 
Administración en nuestra vida cotidiana .pdf
Administración en nuestra vida cotidiana .pdfAdministración en nuestra vida cotidiana .pdf
Administración en nuestra vida cotidiana .pdf
 
Derechos de propiedad intelectual lo mejor
Derechos de propiedad intelectual lo mejorDerechos de propiedad intelectual lo mejor
Derechos de propiedad intelectual lo mejor
 
20240418-CambraSabadell-SesInf-AdopTecnologica-CasoPractico.pdf
20240418-CambraSabadell-SesInf-AdopTecnologica-CasoPractico.pdf20240418-CambraSabadell-SesInf-AdopTecnologica-CasoPractico.pdf
20240418-CambraSabadell-SesInf-AdopTecnologica-CasoPractico.pdf
 
PLANILLA DE CONTROL LIMPIEZA TRAMPA DE GRASA
PLANILLA DE CONTROL LIMPIEZA TRAMPA DE GRASAPLANILLA DE CONTROL LIMPIEZA TRAMPA DE GRASA
PLANILLA DE CONTROL LIMPIEZA TRAMPA DE GRASA
 
Mapa Conceptual relacionado con la Gerencia Industrial, su ámbito de aplicaci...
Mapa Conceptual relacionado con la Gerencia Industrial, su ámbito de aplicaci...Mapa Conceptual relacionado con la Gerencia Industrial, su ámbito de aplicaci...
Mapa Conceptual relacionado con la Gerencia Industrial, su ámbito de aplicaci...
 

NoSql y MongoDB

  • 1. Bases de datos NoSQL y MongoDB David Gómez miércoles 25 de enero de 12
  • 2. David Gómez loper & Trainer Deve a-s istemas. com dgomez @extrem zg @dgome 2 miércoles 25 de enero de 12
  • 3. Un vistazo a las soluciones NoSQL 3 miércoles 25 de enero de 12
  • 4. ¿Qué es NoSQL? 4 (cc) Photo by mwin - http://www.flickr.com/photos/wingler/3429634150 miércoles 25 de enero de 12
  • 5. ¿Qué es NoSQL? 4 (cc) Photo by mwin - http://www.flickr.com/photos/wingler/3429634150 miércoles 25 de enero de 12
  • 6. ¿Qué es NoSQL? NoSQL !== no SQL Not only SQL 4 (cc) Photo by mwin - http://www.flickr.com/photos/wingler/3429634150 miércoles 25 de enero de 12
  • 7. ¿Qué es NoSQL? Non Relational Distributed Horizontally scalable 5 miércoles 25 de enero de 12
  • 8. Motivaciones 6 miércoles 25 de enero de 12
  • 9. 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
  • 10. Características Replicado (particionado horizontal) Sin esquemas (versatibilidad, adaptabilidad) BASE (not ACID) 7 miércoles 25 de enero de 12
  • 11. 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
  • 12. Tipos orientadas a Columna orientadas a Documento Key-value orientadas a Grafos 9 miércoles 25 de enero de 12
  • 13. Orientadas a columna 10 (cc) Photo by profzuckerk - http://www.flickr.com/photos/profzucker/4630958694 miércoles 25 de enero de 12
  • 14. Orientadas a columna Configuración individual de columnas por fila 10 (cc) Photo by profzuckerk - http://www.flickr.com/photos/profzucker/4630958694 miércoles 25 de enero de 12
  • 15. Orientadas a columna Configuración individual de columnas por fila También conocidas como BigTable (google paper) 11 (cc) Photo by Ash Brian - http://www.flickr.com/photos/ashbrian/2977673855 miércoles 25 de enero de 12
  • 16. Orientadas a columna Configuración individual de columnas por fila También conocidas como BigTable (google paper) Tamaño Alta carga de escrituras Disponibilidad MapReduce 11 (cc) Photo by Ash Brian - http://www.flickr.com/photos/ashbrian/2977673855 miércoles 25 de enero de 12
  • 17. Orientadas a columna Configuración individual de columnas por fila También conocidas como BigTable (google paper) Tamaño Alta carga de escrituras Disponibilidad MapReduce 11 (cc) Photo by Ash Brian - http://www.flickr.com/photos/ashbrian/2977673855 miércoles 25 de enero de 12
  • 18. Orientadas a Documento El 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
  • 19. Orientadas a Documento El 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
  • 20. Key-Value 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. 13 miércoles 25 de enero de 12
  • 21. Key-Value 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. 13 miércoles 25 de enero de 12
  • 22. Orientadas a Grafos 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) 14 miércoles 25 de enero de 12
  • 23. Orientadas a Grafos 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) 14 miércoles 25 de enero de 12
  • 24. ¿Cuándo utilizar NoSQL? Teorema CAP (Eric Brewer) 15 Source: Nathan Hurst’s Blog miércoles 25 de enero de 12
  • 25. ¿Cuándo utilizar NoSQL? Teorema CAP (Eric Brewer) Consistency C 15 Source: Nathan Hurst’s Blog miércoles 25 de enero de 12
  • 26. ¿Cuándo utilizar NoSQL? Teorema CAP (Eric Brewer) Consistency Availability C A 15 Source: Nathan Hurst’s Blog miércoles 25 de enero de 12
  • 27. ¿Cuándo utilizar NoSQL? Teorema CAP (Eric Brewer) Consistency Availability C A P Partition Tolerance 15 Source: Nathan Hurst’s Blog miércoles 25 de enero de 12
  • 28. ¿Cuándo utilizar NoSQL? Teorema CAP (Eric Brewer) Consistency Availability C A P Partition Tolerance 15 Source: Nathan Hurst’s Blog miércoles 25 de enero de 12
  • 29. ¿Cuándo utilizar NoSQL? Teorema CAP (Eric Brewer) Consistency Availability C A Sólo 2 P Partition Tolerance 15 Source: Nathan Hurst’s Blog miércoles 25 de enero de 12
  • 30. ¿Cuándo utilizar NoSQL? Teorema CAP (Eric Brewer) Consistency Availability A Oracle, MySQL, C Sólo 2 P Partition Tolerance 15 Source: Nathan Hurst’s Blog miércoles 25 de enero de 12
  • 31. ¿Cuándo utilizar NoSQL? Teorema CAP (Eric Brewer) Consistency Availability A Oracle, MySQL, C Sólo M H yp i s, on e M 2 go rTa em Re DB ble ca d , D , H che at Ba DB aS s to e re P , Partition Tolerance 15 Source: Nathan Hurst’s Blog miércoles 25 de enero de 12
  • 32. ¿Cuándo utilizar NoSQL? Teorema CAP (Eric Brewer) Consistency Availability A Oracle, MySQL, C Sólo M H yp i s, hD , rt, on e M aK 2 uc ra o go rTa em Co and dem Re Ri DB ble ca d B, B, ss ol , D , H che eD a , V at Ba DB pl C mo aS s na to e Dy re P , m RDBMS Si Orientadas a documento Partition Tolerance orientadas a columna Key-Value 15 Source: Nathan Hurst’s Blog miércoles 25 de enero de 12
  • 33. NoSQL Document DB: MongoDB 16 miércoles 25 de enero de 12
  • 34. MongoDB 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 17 miércoles 25 de enero de 12
  • 35. Orientadas a Documento Documentos formateados en JSON 18 miércoles 25 de enero de 12
  • 36. Orientadas a Documento Documentos formateados en JSON { "_id" : { "$oid" : "4f13f2b98de23dc3d58f959a" }, "name" : "NoSQL y MongoDB", "presenter" : "David Gomez", "Event" : "decharlas", "duration" : 60, "timing" : { "start" : 17, "end" : 19 } } 18 miércoles 25 de enero de 12
  • 37. Consultas Utilizando un API y funciones JavaScript 19 miércoles 25 de enero de 12
  • 38. Consultas Utilizando un API y funciones JavaScript beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > 19 miércoles 25 de enero de 12
  • 39. Consultas Utilizando un API y funciones JavaScript beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > use playground switched to db playground > 19 miércoles 25 de enero de 12
  • 40. Consultas Utilizando un API y funciones JavaScript beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > use playground switched to db playground > db.talks.insert({'name' : 'codemotion', 'presenter' : 'David Gomez', 'Event' : 'decharlas' }); > 19 miércoles 25 de enero de 12
  • 41. Consultas Utilizando un API y funciones JavaScript beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > use playground switched 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" } > 19 miércoles 25 de enero de 12
  • 42. 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
  • 43. 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
  • 44. Programación de clientes Multitud de lenguajes (drivers) Transformación a JSON realizada por el driver 22 miércoles 25 de enero de 12
  • 45. Programación de clientes Multitud de lenguajes (drivers) Transformación a JSON realizada por el driver { "name" : "NoSQL y MongoDB", "presenter" : "David Gomez", "Event" : "decharlas", "duration" : 60, "timing" : { "start" : 17, "end" : 19 } } sample.py 22 miércoles 25 de enero de 12
  • 46. Programación de clientes Multitud de lenguajes (drivers) Transformación a JSON realizada por el driver { { "name" : "NoSQL y MongoDB", y MongoDB", "name" => "NoSQL "presenter" : "David Gomez", "presenter" => "David Gomez", "Event" : "decharlas", "Event" => "decharlas", "duration" "duration" => 60, : 60, "timing" : "timing" => { { "start" : 17, "start" => 17, "end" : 19 "end" => 19 } } } } sample.py Ruby 22 miércoles 25 de enero de 12
  • 47. Programación de clientes Multitud de lenguajes (drivers) Transformación a JSON realizada por el driver { { array( "name" => "NoSQL y MongoDB", "name" : "NoSQL y MongoDB", y MongoDB", "name" => "NoSQL "presenter" => "David Gomez", "presenter" : "David Gomez", "presenter" => "David Gomez", "Event" => "decharlas", "Event" : "decharlas", "Event" => "decharlas", "duration" => 60, "duration" "duration" => 60, : 60, "timing" => array( "timing" : "timing" => { { "start" => 17, "start" : 17, "start" => 17, "end" => 19 "end" : 19 "end" => 19 ) } } } } } sample.php sample.py Ruby 22 miércoles 25 de enero de 12
  • 48. Programación de clientes Multitud de lenguajes (drivers) Transformación a JSON realizada por el driver BasicDBObject doc = new BasicDBObject(); { { array( "name" => "NoSQL y MongoDB", y MongoDB"); doc.put("name", "NoSQL "name" : "NoSQL y MongoDB", y MongoDB", "name" => "NoSQL "presenter" => "David Gomez", "David Gomez"); doc.put("presenter", "presenter" : "David Gomez", "presenter" => "David Gomez", "Event" => "decharlas", doc.put("Event", "decharlas"); "Event" : "decharlas", "Event" => "decharlas", doc.put("duration", 60); "duration" => 60, "duration" "duration" => 60, : 60, "timing" => array( "timing" : "timing" => { { BasicDBObject timing = new BasicDBObject(); "start" => 17, "start" : 17, "start" => 17, "end"timing.put("start", 17); => 19 "end" : 19 "end" => 19 ) timing.put("end", 19); } } } doc.put("timing", timing); } } sample.php sample.py Ruby sample.java 22 miércoles 25 de enero de 12
  • 49. 1. Obtener el Driver Importar el driver 23 miércoles 25 de enero de 12
  • 50. 1. Obtener el Driver Importar el driver <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</ artifactId> <version>2.7.0-rc1</version> </dependency> 23 miércoles 25 de enero de 12
  • 51. 1. Obtener el Driver Importar el driver <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</ artifactId> <version>2.7.0-rc1</version> </dependency> 23 miércoles 25 de enero de 12
  • 52. 2. Conexión Obtener la referencia a la BD y la conexión 24 miércoles 25 de enero de 12
  • 53. 2. Conexión Obtener la referencia a la BD y la conexión Mongo m = new Mongo( "127.0.0.1" , 27017 ); DB db = m.getDB( "playground" ); 24 miércoles 25 de enero de 12
  • 54. 2. Conexión Obtener la referencia a la BD y la conexión Mongo m = new Mongo( "127.0.0.1" , 27017 ); DB db = m.getDB( "playground" ); Sobre la BD se puede: 24 miércoles 25 de enero de 12
  • 55. 2. Conexión Obtener la referencia a la BD y la conexión 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); } 24 miércoles 25 de enero de 12
  • 56. 3. Inserciones Crear e insertar un objeto 25 miércoles 25 de enero de 12
  • 57. 3. Inserciones Crear e insertar un objeto 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); 25 miércoles 25 de enero de 12
  • 58. 4. Consultas (I) Obtener todos los documentos de una colección 26 miércoles 25 de enero de 12
  • 59. 4. Consultas (I) Obtener todos los documentos de una colección DBCollection talks = db.getCollection("talks"); DBCursor cursor = talks.find(); while (cursor.hasNext()) { System.out.println(cursor.next()); } 26 miércoles 25 de enero de 12
  • 60. 4. Consultas (I) Obtener todos los documentos de una colección DBCollection talks = db.getCollection("talks"); DBCursor cursor = talks.find(); public abstract class DBCollection { while (cursor.hasNext()) { public final DBCursor find(){ System.out.println(cursor.next()); } 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 ) } 26 miércoles 25 de enero de 12
  • 61. 4. Consultas (II) Consultas “SQL-like” 27 miércoles 25 de enero de 12
  • 62. 4. Consultas (II) Consultas “SQL-like” SELECT * FROM TALKS WHERE PRESENTER = “David Gomez”; Las consultas se hacen con Documentos JSON 27 miércoles 25 de enero de 12
  • 63. 4. Consultas (II) Consultas “SQL-like” SELECT * FROM TALKS WHERE PRESENTER = “David Gomez”; Las consultas se hacen con Documentos JSON { “presenter” : “David Gomez” } 27 miércoles 25 de enero de 12
  • 64. 4. Consultas (II) Consultas “SQL-like” SELECT * FROM TALKS WHERE PRESENTER = “David Gomez”; Las consultas se hacen con Documentos JSON { “presenter” : “David Gomez” } beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > use playground switched to db playground > db.talks.find( { "presenter" : "David Gomez" }); { "_id" : ObjectId("4f13f7e5a00e6496e7a9541b"), "name" : "codemotion", "presenter" : "David Gomez", "Event" : "decharlas" } > 27 miércoles 25 de enero de 12
  • 65. 4. Consultas (II) Consultas “SQL-like” SELECT * FROM TALKS WHERE PRESENTER = “David Gomez”; Las consultas se hacen con Documentos JSON { “presenter” : “David Gomez” } beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 DBObject query = new BasicDBObject(); connecting to: test query.put("presenter", "David Gomez"); > use playground switched to db playground DBCursor davidTalks = talks.find(query); > db.talks.find( { "presenter" : "David Gomez" }); while (davidTalks.hasNext()) { { "_id" : ObjectId("4f13f7e5a00e6496e7a9541b"), "name" : "codemotion", System.out.println(davidTalks.next()); "presenter" : "David Gomez", "Event" : "decharlas" } } > } 27 miércoles 25 de enero de 12
  • 66. 4. Consultas (III) Comparadores <, <=, >=, >, != 28 miércoles 25 de enero de 12
  • 67. 4. Consultas (III) Comparadores <, <=, >=, >, != SELECT * FROM TALKS WHERE duration < 60; 28 miércoles 25 de enero de 12
  • 68. 4. Consultas (III) Comparadores <, <=, >=, >, != SELECT * FROM TALKS WHERE duration < 60; { “duration” : { $lt : 60} } { “duration” : { $lte : 60} } { “duration” : { $gt : 60} } { “duration” : { $gte : 60} } { “duration” : { $ne : 60} } 28 miércoles 25 de enero de 12
  • 69. 4. Consultas (III) Comparadores <, <=, >=, >, != SELECT * FROM TALKS WHERE duration < 60; { “duration” : { $lt : 60} } { “duration” : { $lte : 60} } { “duration” : { $gt : 60} } { “duration” : { $gte : 60} } { “duration” : { $ne : 60} } beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > use playground switched 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 } } > 28 miércoles 25 de enero de 12
  • 70. 4. Consultas (III) Comparadores <, <=, >=, >, != SELECT * FROM TALKS WHERE duration < 60; { “duration” : { $lt : 60} } { “duration” : { $lte : 60} } { “duration” : { $gt : 60} } { “duration” : { $gte : 60} } { “duration” : { $ne : 60} } beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > use playground switched to db playground DBObject query = new BasicDBObject(); query.put("duration", new BasicDBObject("$lt","90")); > > db.talks.find({"duration" : { $lt : 90 } }) { "_id" : ObjectId("4f1402f28de2930293c7cf8e"), "name" : "NoSQL y MongoDB", "presenter" : "David Gomez", DBCursor :shortTalks = talks.find(query); "Event" "decharlas", "duration" : 60, "timing" : { "start" : 17, "end" : 19 } while (shortTalks.hasNext()) { } > System.out.println(shortTalks.next()); } 28 miércoles 25 de enero de 12
  • 71. 4. Consultas (IV) Concatenación de consultas 29 miércoles 25 de enero de 12
  • 72. 4. Consultas (IV) Concatenación de consultas SELECT * FROM TALKS WHERE duration < 90 AND duration > 30; 29 miércoles 25 de enero de 12
  • 73. 4. Consultas (IV) Concatenación de consultas SELECT * FROM TALKS WHERE duration < 90 AND duration > 30; { “duration” : { $lt : 90, $gt : 60} } } 29 miércoles 25 de enero de 12
  • 74. 4. Consultas (IV) Concatenación de consultas 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()); } 29 miércoles 25 de enero de 12
  • 75. 4. Consultas (V) Otros operadores 30 miércoles 25 de enero de 12
  • 76. 4. Consultas (V) Otros operadores $all $exists $mod $ne $in $nin $nor $or $and $size $type 30 miércoles 25 de enero de 12
  • 77. 4. Consultas (y VI) Concatenación de consultas 31 miércoles 25 de enero de 12
  • 78. 4. Consultas (y VI) Concatenación de consultas SELECT * FROM TALKS WHERE duration < 90 AND duration > 30 AND (presenter = “David Gomez” or presenter=”Ricardo Borillo”); 31 miércoles 25 de enero de 12
  • 79. 4. Consultas (y VI) Concatenación de consultas SELECT * FROM TALKS WHERE duration < 90 AND duration > 30 AND (presenter = “David Gomez” or presenter=”Ricardo Borillo”); { “duration” : { $lt : 90, $gt : 60}, $or : [ { “presenter” : “David Gomez”}, { “presenter” : “Ricardo Borillo”} ] } 31 miércoles 25 de enero de 12
  • 80. 4. Consultas (y VI) Concatenación de consultas SELECT * FROM TALKS WHERE duration < 90 AND duration > 30 AND (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); 31 talks.find(query); miércoles 25 de enero de 12
  • 81. DBObjects desde JSON com.mongo.util.JSON 32 miércoles 25 de enero de 12
  • 82. DBObjects desde JSON com.mongo.util.JSON Object query = JSON.parse("{ 'duration' : { $lt : 90, $gt : 60}, " + '$or' : [ { 'presenter' : 'David Gomez'}, " + " " { 'presenter' : 'Ricardo Borillo'} ] }"); DBCursor cursor = db.find((DBObject) query); 32 miércoles 25 de enero de 12
  • 83. Spring Data MongoDB 33 miércoles 25 de enero de 12
  • 84. 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
  • 85. 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
  • 86. Importando Spring Data 36 miércoles 25 de enero de 12
  • 87. Importando Spring Data <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> 36 miércoles 25 de enero de 12
  • 88. Namespace 37 miércoles 25 de enero de 12
  • 89. Namespace <?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> 37 miércoles 25 de enero de 12
  • 90. Namespace <?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"> <mongo:db-­‐factory  dbname="vts"/> </beans> 37 miércoles 25 de enero de 12
  • 91. Namespace <?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"> <mongo:db-­‐factory  dbname="vts"/>   <bean  id="mongoTemplate"  class="org.springframework.data.mongodb.core.MongoTemplate">     <constructor-­‐arg  name="mongoDbFactory"  ref="mongoDbFactory"  />   </bean> </beans> 37 miércoles 25 de enero de 12
  • 92. MongoTemplate   <bean  id="mongoTemplate"  class="org.springframework.data.mongodb.core.MongoTemplate">     <constructor-­‐arg  name="mongoDbFactory"  ref="mongoDbFactory"  />   </bean> Convierte query a JSON Convierte respuesta (“_type”) Gestiona las conexiones Maneja las excepciones 38 miércoles 25 de enero de 12
  • 93. Repository 39 miércoles 25 de enero de 12
  • 94. Repository 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;   } } 39 miércoles 25 de enero de 12
  • 95. Consultas más sencillas 40 miércoles 25 de enero de 12
  • 96. Consultas más sencillas public  abstract  class  AbstractRepository<T>  {   public  List<T>  getByType(String  type)  {     return  mongoTemplate.find( new  Query(Criteria.where("type").is(type)), T.class,  persistentClass);   }   } 40 miércoles 25 de enero de 12
  • 97. Conversión Manual Porque a veces lo automático no funciona 41 miércoles 25 de enero de 12
  • 98. Conversión Manual Porque a veces lo automático no funciona public  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;   } } 41 miércoles 25 de enero de 12
  • 99. Conversión Manual Porque a veces lo automático no funciona 42 miércoles 25 de enero de 12
  • 100. Conversión Manual 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> 42 miércoles 25 de enero de 12
  • 101. Conclusiones 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 43 miércoles 25 de enero de 12
  • 102. Q&A 44 miércoles 25 de enero de 12
  • 103. 45 miércoles 25 de enero de 12