SlideShare una empresa de Scribd logo
Spring Data y MongoDB
               en un proyecto real.

                             David Gómez
                              @dgomezg




sábado 18 de febrero de 12
David Gómez
                                  rchitect & Trainer
                             Sw A              mas.com
                                              siste
                                     extrema-
                              dgomez@
                                           zg
                                    @dgome




sábado 18 de febrero de 12
Spring CORE


                             Rich Web Applications
                             with Spring


                             Enterprise Integration


sábado 18 de febrero de 12
#springio
                             #extrema




sábado 18 de febrero de 12
Hablaremos de



                    Un caso real
                    ¿Por qué NoSQL? ¿Por qué MongoDB?
                    MongoDB ‘a pelo’
                    Spring Data al rescate
                    ¡Cuidado!




sábado 18 de febrero de 12
Un caso real.
                       Control de tráfico marítimo




sábado 18 de febrero de 12
Emisor AIX
                              3-5 min




sábado 18 de febrero de 12
Emisor AIX
                              3-5 min




sábado 18 de febrero de 12
Receptor GPS

                               Radar (3 s)
                              Goniometro



        Estación Meteo,
                                             Emisor AIX
           Cámaras,
                                              3-5 min
                        ...



sábado 18 de febrero de 12
El problema: La escalabilidad




sábado 18 de febrero de 12
El problema: La escalabilidad
          Por cada barco:
                  Recepción y procesamiento de señales (nº)
                  Transacciones,
                  Cálculo de alarmas
                  Gestión de Históricos




sábado 18 de febrero de 12
El problema: La escalabilidad
          Señales
              (1 AIS x 3 min + 1 radar x 3 seg) x 100 barcos
          Alarmas
                  Persistencia de Líneas de Varada
                             (10.000+ ptos x 100+ líneas)
                  40 Alarmas
          Zonas, Elementos Navegación
          Persistencia: Total: 87 tablas + históricos(x2)


sábado 18 de febrero de 12
El problema: La escalabilidad




sábado 18 de febrero de 12
¿Por qué NoSQL?

              Teorema CAP (Eric Brewer)




                                               Source: Nathan Hurst’s Blog

sábado 18 de febrero de 12
¿Por qué NoSQL?

              Teorema CAP (Eric Brewer)

                             Consistency

                                C




                                                        Source: Nathan Hurst’s Blog

sábado 18 de febrero de 12
¿Por qué NoSQL?

              Teorema CAP (Eric Brewer)

                             Consistency                Availability

                                C                          A




                                                                       Source: Nathan Hurst’s Blog

sábado 18 de febrero de 12
¿Por qué NoSQL?

              Teorema CAP (Eric Brewer)

                             Consistency                         Availability

                                C                                   A



                                                  P
                                           Partition Tolerance



                                                                                Source: Nathan Hurst’s Blog

sábado 18 de febrero de 12
¿Por qué NoSQL?

              Teorema CAP (Eric Brewer)

                             Consistency                         Availability

                                C                                   A



                                                  P
                                           Partition Tolerance



                                                                                Source: Nathan Hurst’s Blog

sábado 18 de febrero de 12
¿Por qué NoSQL?

              Teorema CAP (Eric Brewer)

                             Consistency                         Availability

                                C                                   A
                                              Sólo
                                               2

                                                  P
                                           Partition Tolerance



                                                                                Source: Nathan Hurst’s Blog

sábado 18 de febrero de 12
¿Por qué NoSQL?

              Teorema CAP (Eric Brewer)

                             Consistency                         Availability

                                                                    A
                                            Oracle, MySQL,
                                C
                                              Sólo
                                               2

                                                  P
                                           Partition Tolerance



                                                                                Source: Nathan Hurst’s Blog

sábado 18 de febrero de 12
¿Por qué NoSQL?

              Teorema CAP (Eric Brewer)

                             Consistency                                   Availability

                                                                              A
                                                         Oracle, MySQL,
                                C
                                                          Sólo
                                 M Hyp is, M
                                  on er em




                                                           2
                                    go Ta c
                                Re


                                      DB ble ac
                                       d


                                         , D , H heD
                                            at Ba B
                                              aS se
                                                to
                                                  re
                                                     ,




                                                              P
                                                     Partition Tolerance



                                                                                          Source: Nathan Hurst’s Blog

sábado 18 de febrero de 12
¿Por qué NoSQL?
                                                                                                 RDBMS
                                                                                         Orientadas a documento
              Teorema CAP (Eric Brewer)                                                   orientadas a columna
                                                                                                Key-Value

                             Consistency                                              Availability

                                                                                         A
                                                         Oracle, MySQL,
                                C
                                                          Sólo
                                 M Hyp is, M




                                                                                                 ,
                                  on er em




                                                                                   uc ra, ort
                                                           2




                                                                                              aK
                                    go Ta c




                                                                                 Co nd m
                                Re




                                                                                           Ri
                                      DB ble ac




                                                                               B, a de
                                       d




                                                                                        B,
                                                                              D ass ol
                                         , D , H heD




                                                                                     hD
                                                                           ple C o,V
                                            at Ba B




                                                                                  am
                                              aS se
                                                to




                                                                           yn
                                                  re




                                                                           D
                                                     ,




                                                              P
                                                     Partition Tolerance   Sim



                                                                                                     Source: Nathan Hurst’s Blog

sábado 18 de febrero de 12
Pero... ¿NoSQL?




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

sábado 18 de febrero de 12
Pero... ¿NoSQL?




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

sábado 18 de febrero de 12
Pero... ¿NoSQL?




                                            NoSQL !== no SQL
                                            Not only SQL




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

sábado 18 de febrero de 12
NoSQL: ACID vs BASE


              Atomicity,                             Basically
                                                     Available,
              Consistency,
                                                     Soft state,
              Isolation,
                                                     Eventual
              Durability                             consistency




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

sábado 18 de febrero de 12
Tipos.




         orientadas a Columna orientadas a Documento




                      Key-value        orientadas a Grafos

sábado 18 de febrero de 12
¿Por qué MongoDB?

              Orientada a documento
              Almacenados en Colecciones
              (bajo una clave)
              Los documentos pueden ser heterogéneos


              Formatos textuales: JSON & BSON



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

sábado 18 de febrero 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

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

sábado 18 de febrero de 12
Orientadas a Documento


                             Documentos formateados en JSON




sábado 18 de febrero de 12
Orientadas a Documento


                             Documentos formateados en JSON
                      { "_id" : "224000999",
                        "_class" : "com.vts.model.Vessel",
                        "flag" : "ALBANIA",
                        "name" : "Sample NOT_AVAILABLE Vessel 224000999",
                        "callsign" : "SV224000999",
                        "toBow" : 25,
                        "toStern" : 5,
                        "toPort" : 5,
                        "toStarboard" : 5,
                        "comments" : "Sample vessel created automatically for test purposes"
                      }




sábado 18 de febrero de 12
El API

              Consola y API JavaScript:




sábado 18 de febrero de 12
El API

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




sábado 18 de febrero de 12
El API

              Consola y API JavaScript:
          beleriand:bin dgomez$ ./mongo
          MongoDB shell version: 1.8.1
          connecting to: test
          > use vts
          switched to db vts
          >




sábado 18 de febrero de 12
El API

              Consola y API JavaScript:
          beleriand:bin dgomez$ ./mongo
          MongoDB shell version: 1.8.1
          connecting to: test
          > use vts
          switched to db vts
          > show collections
          >
          Event
          WeatherData
          system.indexes
          vessel
          >




sábado 18 de febrero de 12
El API

              Consola y API JavaScript:
          beleriand:bin dgomez$ ./mongo
          MongoDB shell version: 1.8.1
          connecting to: test
          > use vts
          switched to db vts
          > show collections
          >
          Event
          WeatherData
          system.indexes
          vessel
          > db.Event.find()
          >
          { "_id" : ObjectId("4e0b5b211446446f6be3bb1a"),   "_class" :
          "com.vts.model.events.SystemEvent", "timestamp"   :
          ISODate("2011-06-29T17:04:33.039Z") }
          { "_id" : ObjectId("4e0b5b3d144676f49946443f"),   "_class" :
          "com.vts.model.events.SystemEvent", "timestamp"   :
          ISODate("2011-06-29T17:05:01.394Z") }
          >




sábado 18 de febrero de 12
El API

              Consola y API JavaScript:




sábado 18 de febrero de 12
El API

              Consola y API JavaScript:
          > show collections
          Event
          WeatherData
          system.indexes
          vessel
          >




sábado 18 de febrero de 12
El API

              Consola y API JavaScript:
          > show collections
          Event
          WeatherData
          system.indexes
          vessel
          > db.alarms.save({"type" : "speed", "severity" : "warn", "vesselSSID" :
          >
          "224000999"})
          >




sábado 18 de febrero de 12
El API

              Consola y API JavaScript:
          > show collections
          Event
          WeatherData
          system.indexes
          vessel
          > db.alarms.save({"type" : "speed", "severity" : "warn", "vesselSSID" :
          >
          "224000999"})
          > show collections
          >
          Event
          WeatherData
          alarms
          system.indexes
          vessel
          >




sábado 18 de febrero de 12
El API

              Consola y API JavaScript:
          > show collections
          Event
          WeatherData
          system.indexes
          vessel
          > db.alarms.save({"type" : "speed", "severity" : "warn", "vesselSSID" :
          >
          "224000999"})
          > show collections
          >
          Event
          WeatherData
          alarms
          system.indexes
          vessel
          > db.alarms.find()
          >
          { "_id" : ObjectId("4f3acca3ed4cc8078fd1a4be"), "type" : "speed", "severity" :
          "warn", "vesselSSID" : "224000999" }
          >




sábado 18 de febrero de 12
Documentos


                             Identificados por un “_id” (generado o asignado)
                                           Textual (JSON)
                                         Binario (BSON)*
                             Documentos grandes divididos en
                                          chunks




sábado 18 de febrero de 12
Programación de clientes


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




sábado 18 de febrero de 12
Programación de clientes


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

             { "_id" : "224000999",
               "flag" : "ALBANIA",
               "name" : "Sample NOT_AVAILABLE Vessel 224000999",
               "callsign" : "SV224000999",
               "toBow" : 25,
               "toStern" : 5,
               "toPort" : 5,
               "toStarboard" : 5,
               "comments" : "Sample vessel created automatically for test purposes" }

                                                                           sample.py




sábado 18 de febrero de 12
Programación de clientes


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

             { "_id" : "224000999",
                   { "_id" => "224000999",
               "flag""flag" => "ALBANIA",
                      : "ALBANIA",
               "name""name" => "Sample NOT_AVAILABLE 224000999",
                      : "Sample NOT_AVAILABLE Vessel Vessel 224000999",
               "callsign" : "SV224000999",
                     "callsign" => "SV224000999",
               "toBow" : 25, => 25,
                     "toBow"
               "toStern" : 5, => 5,
                     "toStern"
               "toPort" : 5, => 5,
                     "toPort"
               "toStarboard" : 5, => 5,
                     "toStarboard"
               "comments" : "Sample"Sample createdcreated automatically for test purposes" }
                     "comments" => vessel vessel automatically for test purposes" }

                                                                           sample.py    Ruby




sábado 18 de febrero de 12
Programación de clientes


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

             { "_id" : "224000999",
                   { "_id" => "224000999", "224000999",
                          array( "_id" =>
               "flag""flag" "flag" => "ALBANIA",
                      : "ALBANIA",
                             => "ALBANIA",
               "name""name" "name" => "Sample NOT_AVAILABLE Vessel 224000999",
                      : "Sample"Sample NOT_AVAILABLE 224000999",
                             => NOT_AVAILABLE Vessel Vessel 224000999",
               "callsign" : "callsign" => "SV224000999",
                     "callsign" => "SV224000999",
                            "SV224000999",
               "toBow" : 25, => 25, => 25,
                     "toBow""toBow"
               "toStern" : 5, => 5, => 5,
                     "toStern"
                            "toStern"
               "toPort" : 5, => 5, => 5,
                     "toPort"
                            "toPort"
               "toStarboard" : 5, => 5, => 5,
                     "toStarboard"
                            "toStarboard"
               "comments" : "comments" => "Sample vessel created automatically for test purposes"}
                     "comments" => "Sample createdcreated automatically for test purposes" }
                            "Sample vessel vessel automatically for test purposes" }

                                                                            sample.py sample.php
                                                                                       Ruby




sábado 18 de febrero de 12
Programación de clientes


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

                                         BasicDBObject doc = new BasicDBObject();
             { "_id" : "224000999",
                   { "_id" => "224000999", "224000999",
                          array( "_id" => doc.put("flag", vessel.getFlag());
               "flag""flag" "flag" => "ALBANIA",
                      : "ALBANIA",
                             => "ALBANIA",doc.put("name", vessel.getName());
               "name""name" "name" => "Sample NOT_AVAILABLE Vessel 224000999",
                      : "Sample"Sample NOT_AVAILABLE 224000999",
                             => NOT_AVAILABLE Vessel Vessel 224000999",
                                          doc.put("callsign", vessel.getCalSign());
               "callsign" : "callsign" => "SV224000999",
                     "callsign" => "SV224000999",
                            "SV224000999",
                                          doc.put("toBow", vessel.getBow());
               "toBow" : 25, => 25, => 25,
                     "toBow""toBow"
               "toStern" : 5, => 5, => 5,
                     "toStern"
                            "toStern"     doc.put("toPort", vessel.getStern());
               "toPort" : 5, => 5, => 5,
                     "toPort"
                            "toPort"      doc.put("toStern", vessel.getPort());
               "toStarboard" : 5, => 5, doc.put("toStartboard", vessel.getStarboard());
                     "toStarboard"
                            "toStarboard" => 5,
               "comments" : "comments" => doc.put("comments", vessel.getComments()); purposes"}
                     "comments" => "Sample createdcreated automatically for test purposes" }
                            "Sample vessel vessel vessel created automatically for test
                                           "Sample automatically for test purposes" }

                                                                          sample.py sample.php
                                                                                      Ruby
                                                                              sample.java




sábado 18 de febrero de 12
Cliente Java con
                                MongoDB
                                 ‘a pelo’




sábado 18 de febrero de 12
1. Obtener el Driver


                                 Importar el driver




sábado 18 de febrero 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>




sábado 18 de febrero de 12
2. Conexión




                      Obtener la referencia a la BD y la conexión




sábado 18 de febrero 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" );
                             	   	




sábado 18 de febrero de 12
3. Inserciones
                             Crear e insertar un objeto




sábado 18 de febrero de 12
3. Inserciones
                                Crear e insertar un objeto
                             BasicDBObject doc = new BasicDBObject();
                              doc.put("flag", vessel.getFlag());
                              doc.put("name", vessel.getName());
                              doc.put("callsign", vessel.getCalSign());
                              doc.put("toBow", vessel.getBow());
                              doc.put("toPort", vessel.getStern());
                              doc.put("toStern", vessel.getPort());
                              doc.put("toStartboard", vessel.getStarboard());
                              doc.put("comments", vessel.getComments());

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




sábado 18 de febrero de 12
4. Consultas (I)

                Obtener todos los documentos de una colección




sábado 18 de febrero de 12
4. Consultas (I)

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

             DBCursor cursor = vessels.find();

             List<Vessel> vessels = new ArrayList<>();
             while (cursor.hasNext()) {
                  DBObject jsonVessel = cursor.next();
                  Vessel vessel = new Vessel();
                  vessel.setMmsi(jsonVessel.get(“mmsi”));
                  vessel.setLength(jsonVessel.get(“length”));
                    // ...

                    vessels.add(vessel);
             }




sábado 18 de febrero de 12
4. Consultas (I)

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

             DBCursor cursor = vessels.find();

             List<Vessel> vessels = new ArrayList<>();
             while (cursor.hasNext()) { class DBCollection {
                        public abstract
                  DBObject jsonVessel = cursor.next();
                           public final DBCursor find(){
                  Vessel vessel = new Vessel();
                           public final DBCursor find( DBObject ref )
                  vessel.setMmsi(jsonVessel.get(“mmsi”));
                           public final DBCursor find( DBObject ref , DBObject keys )
                  vessel.setLength(jsonVessel.get(“length”));
                    // ...
                            public final DBObject findOne( Object obj )
                    vessels.add(vessel); DBObject findOne( Object obj, DBObject fields )
                            public final
             }
                                 public DBObject findAndModify( DBObject query , DBObject update )

                             }




sábado 18 de febrero de 12
4. Consultas (II)
                              Consultas “SQL-like”




sábado 18 de febrero de 12
4. Consultas (II)
                                        Consultas “SQL-like”
                             En RDBMS:
                                 SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;


                        Las consultas se hacen también en JSON




sábado 18 de febrero de 12
4. Consultas (II)
                                        Consultas “SQL-like”
                             En RDBMS:
                                 SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;


                        Las consultas se hacen también en JSON
                                          { “flag” : “ALBANIA” }




sábado 18 de febrero de 12
4. Consultas (II)
                                        Consultas “SQL-like”
                             En RDBMS:
                                 SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;


                        Las consultas se hacen también en JSON
                                          { “flag” : “ALBANIA” }

         beleriand:bin dgomez$ ./mongo
         MongoDB shell version: 1.8.1
         connecting to: test
         > use vts
         switched to db vts
         > db.vessel.find( { "flag" : "ALBANIA" });
         { "_id" : "224312999", "_class" : "com.vts.model.Vessel", "flag" : "ALBANIA",
         "name" : "Sample TOWING Vessel 224312999", "callsign" : "SV224312999", “length”:
         30, “beam” : “10”, "toBow" : 25, "toStern" : 5, "toPort" : 5, "toStarboard" : 5,
         "comments" : "Sample vessel created automatically for test purposes" }
         >




sábado 18 de febrero de 12
4. Consultas (II)
                                        Consultas “SQL-like”
                             En RDBMS:
                                 SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;


                        Las consultas se hacen también en JSON
                                          { “flag” : “ALBANIA” }

         beleriand:bin dgomez$ ./mongo
         MongoDB shell version: 1.8.1
         connecting to: test
         > use vts
         switched to db vts            DBObject query = new BasicDBObject();
                                       query.put("flag", "ALBANIA");
         > db.vessel.find( { "flag" : "ALBANIA" });
         { "_id" : "224312999", "_class" : "com.vts.model.Vessel", "flag" : "ALBANIA",
                                       DBCursor albanianShips = vessels.find(query);
         "name" : "Sample TOWING Vessel 224312999", "callsign" : "SV224312999", “length”:
         30, “beam” : “10”, "toBow" : 25, "toStern" : 5, "toPort" : 5, {
                                       while (albanianShips.hasNext()) "toStarboard" : 5,
                                          	 // ...
         "comments" : "Sample vessel created automatically for test purposes" }
         >                             }




sábado 18 de febrero de 12
Operadores de consulta


                                  Otros operadores




sábado 18 de febrero de 12
Operadores de consulta


                                  Otros operadores
                                        $all
                                        $and
                                        $exists
                                        $gt
                                        $in
                                        $lt
                                        $mod
                                        $ne
                                        $nin
                                        $nor
                                        $or
                                        $size
                                        $type




sábado 18 de febrero de 12
Consultas complejas
                              Concatenación de consultas
          RDBMS:




sábado 18 de febrero de 12
Consultas complejas
                                Concatenación de consultas
                             SELECT * FROM VESSELS WHERE length < 90 AND length > 30
          RDBMS:                  AND (flag = “ALBANIA” or flag = ”SAN MARINO”);




sábado 18 de febrero de 12
Consultas complejas
                                Concatenación de consultas
                             SELECT * FROM VESSELS WHERE length < 90 AND length > 30
          RDBMS:                  AND (flag = “ALBANIA” or flag = ”SAN MARINO”);

                                {
                                    “length” : { $lt : 90, $gt : 30},
          Mongo:                    $or : [
                                        { “flag” : “ALBANIA”},
                                        { “flag” : “SAN MARINO”} ]
                                }




sábado 18 de febrero de 12
Consultas complejas
                                  Concatenación de consultas
                              SELECT * FROM VESSELS WHERE length < 90 AND length > 30
          RDBMS:                   AND (flag = “ALBANIA” or flag = ”SAN MARINO”);

                                  {
                                      “length” : { $lt : 90, $gt : 30},
          Mongo:                      $or : [
                                          { “flag” : “ALBANIA”},
                                          { “flag” : “SAN MARINO”} ]
                                  }

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

                             DBObject [] flags = {
          Mongo                   new BasicDBObject("flag", "ALBANIA"),
                                  new BasicDBObject("flag", "SAN MARINO")
                             };
          Driver:            query.put("$or", flags);

                             talks.find(query);




sábado 18 de febrero de 12
DBObjects desde JSON



                                 com.mongo.util.JSON




sábado 18 de febrero de 12
DBObjects desde JSON



                                     com.mongo.util.JSON
                   Object query = JSON.parse("{ 'length' : { $lt : 90, $gt : 30}, " +
                   	           	 '$or' : [ { 'flag' : 'ALBANIA}, " +
                                "
                   	           	          " { 'flag' : 'SAN MARINO'} ] }");

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




sábado 18 de febrero de 12
Además...




                    Gestión de excepciones
                    Gestión recursos
                             DB, Collección, Cursores, DBObjects...

                    Transformaciones Objeto                           JSON




sábado 18 de febrero de 12
Spring Data MongoDB




sábado 18 de febrero de 12
Spring Data
     Objetivo:
             Proporcionar un mecanismo homogéneo y
             completo para el acceso a BD NoSQL
     Multiples proyectos:
             Soportados:
                        MongoDB, Redis, Neo4j, Hadoop, GemFire,
                        RiaK
             En proceso:
                        CouchDB, Hbase, Cassandra


sábado 18 de febrero de 12
Spring Data y MongoDB



               XML namespace para configurar driver Mongo
                                  MongoTemplate
                    Conversión de excepciones automática
                               Conversión Configurable
                                   JMX monitoring




sábado 18 de febrero de 12
Importando Spring Data




sábado 18 de febrero de 12
Importando Spring Data

                        <repository>
                            <id>spring-release</id>
                            <name>Spring Maven Release Repository</name>
                            <url>http://repo.springsource.org/libs-release</url>
                        </repository>

                        <dependency>
                            <groupId>org.springframework.data</groupId>
                            <artifactId>spring-data-mongodb</artifactId>
                            <version>1.0.1.RELEASE</version>
                        </dependency>




sábado 18 de febrero de 12
Namespace




sábado 18 de febrero 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>




sábado 18 de febrero 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>




sábado 18 de febrero 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>




sábado 18 de febrero de 12
MongoTemplate
          <bean	
  id="mongoTemplate"	
  class="org.springframework.data.mongodb.core.MongoTemplate">
          	
   <constructor-­‐arg	
  name="mongoDbFactory"	
  ref="mongoDbFactory"	
  />
          </bean>


                                     Identifica la colección
                                 Convierte query a JSON
                             Convierte respuesta (“_class”)
                             Gestiona las conexiones y cursores
                                Convierte las excepciones




sábado 18 de febrero de 12
MongoTemplate - Consultas




sábado 18 de febrero de 12
MongoTemplate - Consultas


    public class MongoTemplate implements MongoOperations, ApplicationContextAware {

    	     public <T> T findOne(Query query, Class<T> entityClass)

    	     public <T> List<T> find(Query query, Class<T> entityClass)

    	     public <T> T findById(Object id, Class<T> entityClass)

    	     public <T> List<T> findAll(Class<T> entityClass)

    }




sábado 18 de febrero de 12
MongoTemplate - Consultas


    public class MongoTemplate implements MongoOperations, ApplicationContextAware {

    	       public <T> T findOne(Query query, Class<T> entityClass)

    	       public <T> List<T> find(Query query, Class<T> entityClass)

    	       public <T> T findById(Object id, Class<T> entityClass)

    	       public <T> List<T> findAll(Class<T> entityClass)

    }
        	     public <T> T findOne(Query query, Class<T> entityClass, String collectionName)
              ....




sábado 18 de febrero de 12
Consultas
                                       Consultas “SQL-like”
         RDBMS:              SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;




sábado 18 de febrero de 12
Consultas
                                       Consultas “SQL-like”
         RDBMS:              SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;


                        Las consultas se hacen también en JSON
         Mongo:                           { “flag” : “ALBANIA” }




sábado 18 de febrero de 12
Consultas
                                       Consultas “SQL-like”
         RDBMS:              SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;


                        Las consultas se hacen también en JSON
         Mongo:                           { “flag” : “ALBANIA” }



                             DBCollection vessels = db.getCollection("vessel");

                             DBObject query = new BasicDBObject();
                             query.put("flag", "ALBANIA");

         Mongo               DBCursor albanianShips = vessels.find(query);
                             while (albanianShips.hasNext()) {
         Driver:                   DBObject result = albanianShips.next();
                                	 // Create Vessel object from DBObject
                             }




sábado 18 de febrero de 12
Consultas
                                        Consultas “SQL-like”
         RDBMS:              SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;


                        Las consultas se hacen también en JSON
         Mongo:                            { “flag” : “ALBANIA” }



                         Query query = new Query(Criteria.where("flag").is("ALBANIA");

                         List<Vessel> vessels = mongoTemplate.find(query, Vessel.class);


                                                   Utilizado para
                                                        Identificación de la colección
                                                        Serialización JSON



sábado 18 de febrero de 12
Serialización automática




sábado 18 de febrero de 12
Serialización automática



            {	
  "_id"	
  :	
  "224000999",
            	
  	
  "_class"	
  :	
  "com.vts.model.Vessel",
            	
  	
  "flag"	
  :	
  "ALBANIA",
            	
  	
  "name"	
  :	
  "Sample	
  NOT_AVAILABLE	
  Vessel	
  224000999",
            	
  	
  "callsign"	
  :	
  "SV224000999",
            	
  	
  "toBow"	
  :	
  25,
            	
  	
  "toStern"	
  :	
  5,
            	
  	
  "toPort"	
  :	
  5,
            	
  	
  "toStarboard"	
  :	
  5,
            	
  	
  "comments"	
  :	
  "Sample	
  vessel	
  created	
  automatically	
  for	
  test	
  purposes"	
  }




sábado 18 de febrero de 12
Consultas complejas
                              Concatenación de consultas




sábado 18 de febrero de 12
Consultas complejas
                                  Concatenación de consultas
                    SELECT * FROM VESSELS WHERE length < 90 AND length > 30
                         ORDER BY lastUpdate;




sábado 18 de febrero de 12
Consultas complejas
                                  Concatenación de consultas
                    SELECT * FROM VESSELS WHERE length < 90 AND length > 30
                         ORDER BY lastUpdate;



                                 {
                                     “length” : { $lt : 90, $gt : 30}
                                 }




sábado 18 de febrero de 12
Consultas complejas
                                  Concatenación de consultas
                    SELECT * FROM VESSELS WHERE length < 90 AND length > 30
                         ORDER BY lastUpdate;



                                  {
                                      “length” : { $lt : 90, $gt : 30}
                                  }



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

                             DBObject [] flags = {
                                  new BasicDBObject("flag", "ALBANIA"),
                                  new BasicDBObject("flag", "SAN MARINO")
                             };
                             query.put("$or", flags);

                             vessels.find(query);




sábado 18 de febrero de 12
Consultas complejas
                                  Concatenación de consultas
                    SELECT * FROM VESSELS WHERE length < 90 AND length > 30
                         ORDER BY lastUpdate;



                                 {
                                     “length” : { $lt : 90, $gt : 30}
                                 }




sábado 18 de febrero de 12
Consultas complejas
                                      Concatenación de consultas
                    SELECT * FROM VESSELS WHERE length < 90 AND length > 30
                         ORDER BY lastUpdate;



                                      {
                                          “length” : { $lt : 90, $gt : 30}
                                      }




                             Criteria criteria = Criteria.where("length");
                             criteria.gte(from);
                             criteria.lte(to);

                             Query query = new Query(criteria);
                             query.sort().on("lastUpdate", Order.ASCENDING);

                             List<Vessel> vessels = mongoTemplate.find(query, Vessel.class);




sábado 18 de febrero de 12
MongoTemplate - inserciones




sábado 18 de febrero de 12
MongoTemplate - inserciones



    public class MongoTemplate implements MongoOperations, ApplicationContextAware {

    	     public void save(Object objectToSave)

    	     public void save(Object objectToSave, String collectionName)

    }




sábado 18 de febrero de 12
AbstractRepository




sábado 18 de febrero de 12
AbstractRepository

      public abstract class AbstractMongoRepository<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 String determineCollection() {
      	     	   return persistentClass.getSimpleName();
      	     }
      }




sábado 18 de febrero de 12
AbstractRepository




sábado 18 de febrero de 12
AbstractRepository
      public abstract class AbstractMongoRepository<T> {

      	     public void save(T e) {
      	     	   mongoTemplate.save(e, determineCollection());
      	     }
      	
      	     public void save(Collection<T> entities) {
      	     	   for (T e : entities) {
      	     	   	    save(e);
      	     	   }
      	     }
      	
      	     public void removeById(String id) {
      	     	   Object e = findById(id);
      	     	   if (e != null) {	 	   	
      	     	   	    mongoTemplate.remove(e, determineCollection());
      	     	   }	
      	     }
      	
      	     public T findById(String id) {
      	     	   T t = mongoTemplate.findById(id, persistentClass);
      	     	   if (t == null) {
      	     	   	    throw new ObjectNotFoundException(persistentClass, id);
      	     	   }
      	     	   return t;
      	     }
      }




sábado 18 de febrero de 12
VesselRepository




sábado 18 de febrero de 12
VesselRepository



      public class VesselRepository extends AbstractMongoRepository<Vessel> {

      	     public VesselRepository() {
      	     	   super(Vessel.class);
      	     }

      }




sábado 18 de febrero de 12
A tener en cuenta




sábado 18 de febrero de 12
El caso de BitSet
                             Cuidado con los campos transient




sábado 18 de febrero de 12
El caso de BitSet
                             Cuidado con los campos transient
      public class BitSet implements Cloneable, java.io.Serializable {

            /** The internal field corresponding to the serialField "bits". */
             */
            private long[] words;

            /** The number of words in the logical size of this Bitset */
            private transient int wordsInUse = 0;

            private void expandTo(int wordIndex) {
      	        int wordsRequired = wordIndex+1;
            	 if (wordsInUse < wordsRequired) {
      	            ensureCapacity(wordsRequired);
      	            wordsInUse = wordsRequired;
      	        }
            }
      }




sábado 18 de febrero de 12
Conversión Manual




sábado 18 de febrero de 12
Conversión Manual
             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;
             	
     }
             }




sábado 18 de febrero de 12
Conversión Manual
                             Porque a veces lo automático no funciona




sábado 18 de febrero 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>




sábado 18 de febrero de 12
Queries con multiples valores




sábado 18 de febrero de 12
Queries con multiples valores


                             Query query = new Query(
                             	   Criteria
                             	   	    .where("length").gte(20)
                             	   	    .and("length").lt(60));




sábado 18 de febrero de 12
Queries con multiples valores


                             Query query = new Query(
                             	   Criteria
                             	   	    .where("length").gte(20)
                             	   	    .and("length").lt(60));




               DEBUG MongoTemplate - find using query: { "length" : { "$lt" : 60} }




sábado 18 de febrero de 12
Queries con multiples valores




sábado 18 de febrero de 12
Queries con multiples valores


                             Query query = new Query(
                             	   Criteria
                             	   	    .where("length").gte(20).lte(60));




sábado 18 de febrero de 12
Queries con multiples valores


                             Query query = new Query(
                             	   Criteria
                             	   	    .where("length").gte(20).lte(60));




      DEBUG MongoTemplate - find using query: { "toBow" : { "$gte" : 20 , "$lte" : 60} }




sábado 18 de febrero de 12
Conclusiones
           Reducción del número de tablas (87x2 vs 5)
           Optimización en el rendimiento de escrituras
           Simplificación de los DAOs con Spring-Data


           Otras ventajas:
           Documentos en formato de Respuesta REST
           interfaz Javascript en la consola



sábado 18 de febrero de 12
Q&A
                             David Gómez
                              @dgomezg




sábado 18 de febrero de 12

Más contenido relacionado

PPTX
File transfer protocol
PPT
Web Development using HTML & CSS
PPTX
Static and Dynamic webpage
PPTX
Intro to WordPress Dashboard
PDF
Build a Website Using HTML + CSS
PPTX
Javascript operators
PDF
GET and POST in PHP
PPTX
Threads ppt
File transfer protocol
Web Development using HTML & CSS
Static and Dynamic webpage
Intro to WordPress Dashboard
Build a Website Using HTML + CSS
Javascript operators
GET and POST in PHP
Threads ppt

La actualidad más candente (20)

PDF
IT2255 Web Essentials - Unit V Servlets and Database Connectivity
PPTX
TCP/IP Presentation lab encapsulation and de-capsulation Nick Raston 2143803
PPTX
Osi reference model
PPTX
Uniform Resource Locator (URL)
PPT
Data Link Layer
PPT
DBMS an Example
PPT
Introduction to HTML5
PPTX
Control Structure in JavaScript (1).pptx
PPTX
2.3.1 creating database, table and relationship on Access 2003
PPTX
switching techniques in data communication and networking
PPTX
uniform resource locator
PPTX
WEB-SYSTEM-AND-TECHNOLOGIES-INTRODUCTION-1.pptx
PPTX
world wide web
PPTX
Tcp/ip model
PPT
TCP/IP Protocols With All Layer Description
PPTX
Dbms classification according to data models
PPT
data mining
PPTX
Iot logical design
PPTX
Basic Html Knowledge for students
IT2255 Web Essentials - Unit V Servlets and Database Connectivity
TCP/IP Presentation lab encapsulation and de-capsulation Nick Raston 2143803
Osi reference model
Uniform Resource Locator (URL)
Data Link Layer
DBMS an Example
Introduction to HTML5
Control Structure in JavaScript (1).pptx
2.3.1 creating database, table and relationship on Access 2003
switching techniques in data communication and networking
uniform resource locator
WEB-SYSTEM-AND-TECHNOLOGIES-INTRODUCTION-1.pptx
world wide web
Tcp/ip model
TCP/IP Protocols With All Layer Description
Dbms classification according to data models
data mining
Iot logical design
Basic Html Knowledge for students
Publicidad

Destacado (20)

PPSX
Presentacion BD NoSQL
PDF
Buenas prácticas para pequeños/medianos operadores de telefonía basados en Op...
KEY
Mongo Mapper
PDF
Codemotion 2013 - Quiero tiempo real y lo quiero para ayer
PPT
Sistema de préstamo
PPT
Spring ORM
PPTX
MongoDB + Java + Spring Data
PDF
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!
PPTX
Spring boot et. al. para el impaciente
PPTX
Características MONGO DB
PDF
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
PPTX
PPTX
movimiento uniformemente acelerado
PDF
What Makes Great Infographics
PDF
Masters of SlideShare
PDF
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
PDF
You Suck At PowerPoint!
PDF
10 Ways to Win at SlideShare SEO & Presentation Optimization
PDF
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
PDF
How to Make Awesome SlideShares: Tips & Tricks
Presentacion BD NoSQL
Buenas prácticas para pequeños/medianos operadores de telefonía basados en Op...
Mongo Mapper
Codemotion 2013 - Quiero tiempo real y lo quiero para ayer
Sistema de préstamo
Spring ORM
MongoDB + Java + Spring Data
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!
Spring boot et. al. para el impaciente
Características MONGO DB
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
movimiento uniformemente acelerado
What Makes Great Infographics
Masters of SlideShare
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
You Suck At PowerPoint!
10 Ways to Win at SlideShare SEO & Presentation Optimization
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
How to Make Awesome SlideShares: Tips & Tricks
Publicidad

Similar a Spring Data y Mongo DB en un proyecto Real (20)

PDF
NoSql y MongoDB
PDF
SolidQ Business Analytics Day | Escalabilidad “ilimitada” con SQL Server
PPTX
BcnDevCon12 - CQRS explicado a mi compañero arquitecto
PPTX
Bd no sql conceptos basicos
PDF
SQL Server 2008 R2 StreamInsight
PDF
Redis–symfony–barcelona–31 05-2012
PDF
Db4objects
PDF
Por qué hacemos persistencia de datos
PPTX
SQL Server Fundamentals
PDF
Adapting Component-based User Interfaces at Runtime using Observers
PPTX
Dominio adquisicion e implementacion
PPTX
Dominio adquisicion e implementacion
PDF
Pinceladas SQL 2012, Alta Disponibilidad
PPTX
ConsistenciayReplicación en los sistemas operativos distribuidos
PPTX
Video Introduction to NoSQL (1).pptx
PPT
Sesion final as1
PDF
200508 - Bases de Datos
PDF
PDF
Introducción MongoDB con Java
NoSql y MongoDB
SolidQ Business Analytics Day | Escalabilidad “ilimitada” con SQL Server
BcnDevCon12 - CQRS explicado a mi compañero arquitecto
Bd no sql conceptos basicos
SQL Server 2008 R2 StreamInsight
Redis–symfony–barcelona–31 05-2012
Db4objects
Por qué hacemos persistencia de datos
SQL Server Fundamentals
Adapting Component-based User Interfaces at Runtime using Observers
Dominio adquisicion e implementacion
Dominio adquisicion e implementacion
Pinceladas SQL 2012, Alta Disponibilidad
ConsistenciayReplicación en los sistemas operativos distribuidos
Video Introduction to NoSQL (1).pptx
Sesion final as1
200508 - Bases de Datos
Introducción MongoDB con Java

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

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

Último (20)

PDF
Plantilla para Diseño de Narrativas Transmedia.pdf
PDF
Maste clas de estructura metálica y arquitectura
PPTX
Presentación de Redes de Datos modelo osi
PPTX
historia_web de la creacion de un navegador_presentacion.pptx
PDF
taller de informática - LEY DE OHM
PDF
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
PPTX
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PPT
Que son las redes de computadores y sus partes
PPTX
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
PDF
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PDF
Estrategia de apoyo tecnología miguel angel solis
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
PPTX
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
PDF
Estrategia de apoyo tecnología grado 9-3
PPTX
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PDF
Calidad desde el Docente y la mejora continua .pdf
PDF
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
PDF
CyberOps Associate - Cisco Networking Academy
PPTX
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
Plantilla para Diseño de Narrativas Transmedia.pdf
Maste clas de estructura metálica y arquitectura
Presentación de Redes de Datos modelo osi
historia_web de la creacion de un navegador_presentacion.pptx
taller de informática - LEY DE OHM
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Que son las redes de computadores y sus partes
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
Zarate Quispe Alex aldayir aplicaciones de internet .docx
Estrategia de apoyo tecnología miguel angel solis
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
Estrategia de apoyo tecnología grado 9-3
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Calidad desde el Docente y la mejora continua .pdf
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
CyberOps Associate - Cisco Networking Academy
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...

Spring Data y Mongo DB en un proyecto Real

  • 1. Spring Data y MongoDB en un proyecto real. David Gómez @dgomezg sábado 18 de febrero de 12
  • 2. David Gómez rchitect & Trainer Sw A mas.com siste extrema- dgomez@ zg @dgome sábado 18 de febrero de 12
  • 3. Spring CORE Rich Web Applications with Spring Enterprise Integration sábado 18 de febrero de 12
  • 4. #springio #extrema sábado 18 de febrero de 12
  • 5. Hablaremos de Un caso real ¿Por qué NoSQL? ¿Por qué MongoDB? MongoDB ‘a pelo’ Spring Data al rescate ¡Cuidado! sábado 18 de febrero de 12
  • 6. Un caso real. Control de tráfico marítimo sábado 18 de febrero de 12
  • 7. Emisor AIX 3-5 min sábado 18 de febrero de 12
  • 8. Emisor AIX 3-5 min sábado 18 de febrero de 12
  • 9. Receptor GPS Radar (3 s) Goniometro Estación Meteo, Emisor AIX Cámaras, 3-5 min ... sábado 18 de febrero de 12
  • 10. El problema: La escalabilidad sábado 18 de febrero de 12
  • 11. El problema: La escalabilidad Por cada barco: Recepción y procesamiento de señales (nº) Transacciones, Cálculo de alarmas Gestión de Históricos sábado 18 de febrero de 12
  • 12. El problema: La escalabilidad Señales (1 AIS x 3 min + 1 radar x 3 seg) x 100 barcos Alarmas Persistencia de Líneas de Varada (10.000+ ptos x 100+ líneas) 40 Alarmas Zonas, Elementos Navegación Persistencia: Total: 87 tablas + históricos(x2) sábado 18 de febrero de 12
  • 13. El problema: La escalabilidad sábado 18 de febrero de 12
  • 14. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Source: Nathan Hurst’s Blog sábado 18 de febrero de 12
  • 15. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency C Source: Nathan Hurst’s Blog sábado 18 de febrero de 12
  • 16. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency Availability C A Source: Nathan Hurst’s Blog sábado 18 de febrero de 12
  • 17. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency Availability C A P Partition Tolerance Source: Nathan Hurst’s Blog sábado 18 de febrero de 12
  • 18. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency Availability C A P Partition Tolerance Source: Nathan Hurst’s Blog sábado 18 de febrero de 12
  • 19. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency Availability C A Sólo 2 P Partition Tolerance Source: Nathan Hurst’s Blog sábado 18 de febrero de 12
  • 20. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency Availability A Oracle, MySQL, C Sólo 2 P Partition Tolerance Source: Nathan Hurst’s Blog sábado 18 de febrero de 12
  • 21. ¿Por qué NoSQL? Teorema CAP (Eric Brewer) Consistency Availability A Oracle, MySQL, C Sólo M Hyp is, M on er em 2 go Ta c Re DB ble ac d , D , H heD at Ba B aS se to re , P Partition Tolerance Source: Nathan Hurst’s Blog sábado 18 de febrero de 12
  • 22. ¿Por qué NoSQL? RDBMS Orientadas a documento Teorema CAP (Eric Brewer) orientadas a columna Key-Value Consistency Availability A Oracle, MySQL, C Sólo M Hyp is, M , on er em uc ra, ort 2 aK go Ta c Co nd m Re Ri DB ble ac B, a de d B, D ass ol , D , H heD hD ple C o,V at Ba B am aS se to yn re D , P Partition Tolerance Sim Source: Nathan Hurst’s Blog sábado 18 de febrero de 12
  • 23. Pero... ¿NoSQL? (cc) Photo by mwin - http://www.flickr.com/photos/wingler/3429634150 sábado 18 de febrero de 12
  • 24. Pero... ¿NoSQL? (cc) Photo by mwin - http://www.flickr.com/photos/wingler/3429634150 sábado 18 de febrero de 12
  • 25. Pero... ¿NoSQL? NoSQL !== no SQL Not only SQL (cc) Photo by mwin - http://www.flickr.com/photos/wingler/3429634150 sábado 18 de febrero de 12
  • 26. NoSQL: ACID vs BASE Atomicity, Basically Available, Consistency, Soft state, Isolation, Eventual Durability consistency (cc) Photo by zhouxuan12345678 - http://www.flickr.com/photos/53921113@N02/5645102295/ sábado 18 de febrero de 12
  • 27. Tipos. orientadas a Columna orientadas a Documento Key-value orientadas a Grafos sábado 18 de febrero de 12
  • 28. ¿Por qué MongoDB? Orientada a documento Almacenados en Colecciones (bajo una clave) Los documentos pueden ser heterogéneos Formatos textuales: JSON & BSON (cc) Photo by Ampersand Duck - http://www.flickr.com/photos/ampersandduck/4941185476 sábado 18 de febrero de 12
  • 29. MongoDB Escrita en C++ Orientada a documento Formato JSON (o BSON) Un poco SQL (queries, índices, Referencias externas) Particionado horizontal (sharding) Consultas Javascript (cc) Photo by Ampersand Duck - http://www.flickr.com/photos/ampersandduck/4941185476 sábado 18 de febrero de 12
  • 30. Orientadas a Documento Documentos formateados en JSON sábado 18 de febrero de 12
  • 31. Orientadas a Documento Documentos formateados en JSON { "_id" : "224000999", "_class" : "com.vts.model.Vessel", "flag" : "ALBANIA", "name" : "Sample NOT_AVAILABLE Vessel 224000999", "callsign" : "SV224000999", "toBow" : 25, "toStern" : 5, "toPort" : 5, "toStarboard" : 5, "comments" : "Sample vessel created automatically for test purposes" } sábado 18 de febrero de 12
  • 32. El API Consola y API JavaScript: sábado 18 de febrero de 12
  • 33. El API Consola y API JavaScript: beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > sábado 18 de febrero de 12
  • 34. El API Consola y API JavaScript: beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > use vts switched to db vts > sábado 18 de febrero de 12
  • 35. El API Consola y API JavaScript: beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > use vts switched to db vts > show collections > Event WeatherData system.indexes vessel > sábado 18 de febrero de 12
  • 36. El API Consola y API JavaScript: beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > use vts switched to db vts > show collections > Event WeatherData system.indexes vessel > db.Event.find() > { "_id" : ObjectId("4e0b5b211446446f6be3bb1a"), "_class" : "com.vts.model.events.SystemEvent", "timestamp" : ISODate("2011-06-29T17:04:33.039Z") } { "_id" : ObjectId("4e0b5b3d144676f49946443f"), "_class" : "com.vts.model.events.SystemEvent", "timestamp" : ISODate("2011-06-29T17:05:01.394Z") } > sábado 18 de febrero de 12
  • 37. El API Consola y API JavaScript: sábado 18 de febrero de 12
  • 38. El API Consola y API JavaScript: > show collections Event WeatherData system.indexes vessel > sábado 18 de febrero de 12
  • 39. El API Consola y API JavaScript: > show collections Event WeatherData system.indexes vessel > db.alarms.save({"type" : "speed", "severity" : "warn", "vesselSSID" : > "224000999"}) > sábado 18 de febrero de 12
  • 40. El API Consola y API JavaScript: > show collections Event WeatherData system.indexes vessel > db.alarms.save({"type" : "speed", "severity" : "warn", "vesselSSID" : > "224000999"}) > show collections > Event WeatherData alarms system.indexes vessel > sábado 18 de febrero de 12
  • 41. El API Consola y API JavaScript: > show collections Event WeatherData system.indexes vessel > db.alarms.save({"type" : "speed", "severity" : "warn", "vesselSSID" : > "224000999"}) > show collections > Event WeatherData alarms system.indexes vessel > db.alarms.find() > { "_id" : ObjectId("4f3acca3ed4cc8078fd1a4be"), "type" : "speed", "severity" : "warn", "vesselSSID" : "224000999" } > sábado 18 de febrero de 12
  • 42. Documentos Identificados por un “_id” (generado o asignado) Textual (JSON) Binario (BSON)* Documentos grandes divididos en chunks sábado 18 de febrero de 12
  • 43. Programación de clientes Multitud de lenguajes (drivers) Transformación a JSON realizada por el driver sábado 18 de febrero de 12
  • 44. Programación de clientes Multitud de lenguajes (drivers) Transformación a JSON realizada por el driver { "_id" : "224000999", "flag" : "ALBANIA", "name" : "Sample NOT_AVAILABLE Vessel 224000999", "callsign" : "SV224000999", "toBow" : 25, "toStern" : 5, "toPort" : 5, "toStarboard" : 5, "comments" : "Sample vessel created automatically for test purposes" } sample.py sábado 18 de febrero de 12
  • 45. Programación de clientes Multitud de lenguajes (drivers) Transformación a JSON realizada por el driver { "_id" : "224000999", { "_id" => "224000999", "flag""flag" => "ALBANIA", : "ALBANIA", "name""name" => "Sample NOT_AVAILABLE 224000999", : "Sample NOT_AVAILABLE Vessel Vessel 224000999", "callsign" : "SV224000999", "callsign" => "SV224000999", "toBow" : 25, => 25, "toBow" "toStern" : 5, => 5, "toStern" "toPort" : 5, => 5, "toPort" "toStarboard" : 5, => 5, "toStarboard" "comments" : "Sample"Sample createdcreated automatically for test purposes" } "comments" => vessel vessel automatically for test purposes" } sample.py Ruby sábado 18 de febrero de 12
  • 46. Programación de clientes Multitud de lenguajes (drivers) Transformación a JSON realizada por el driver { "_id" : "224000999", { "_id" => "224000999", "224000999", array( "_id" => "flag""flag" "flag" => "ALBANIA", : "ALBANIA", => "ALBANIA", "name""name" "name" => "Sample NOT_AVAILABLE Vessel 224000999", : "Sample"Sample NOT_AVAILABLE 224000999", => NOT_AVAILABLE Vessel Vessel 224000999", "callsign" : "callsign" => "SV224000999", "callsign" => "SV224000999", "SV224000999", "toBow" : 25, => 25, => 25, "toBow""toBow" "toStern" : 5, => 5, => 5, "toStern" "toStern" "toPort" : 5, => 5, => 5, "toPort" "toPort" "toStarboard" : 5, => 5, => 5, "toStarboard" "toStarboard" "comments" : "comments" => "Sample vessel created automatically for test purposes"} "comments" => "Sample createdcreated automatically for test purposes" } "Sample vessel vessel automatically for test purposes" } sample.py sample.php Ruby sábado 18 de febrero de 12
  • 47. Programación de clientes Multitud de lenguajes (drivers) Transformación a JSON realizada por el driver BasicDBObject doc = new BasicDBObject(); { "_id" : "224000999", { "_id" => "224000999", "224000999", array( "_id" => doc.put("flag", vessel.getFlag()); "flag""flag" "flag" => "ALBANIA", : "ALBANIA", => "ALBANIA",doc.put("name", vessel.getName()); "name""name" "name" => "Sample NOT_AVAILABLE Vessel 224000999", : "Sample"Sample NOT_AVAILABLE 224000999", => NOT_AVAILABLE Vessel Vessel 224000999", doc.put("callsign", vessel.getCalSign()); "callsign" : "callsign" => "SV224000999", "callsign" => "SV224000999", "SV224000999", doc.put("toBow", vessel.getBow()); "toBow" : 25, => 25, => 25, "toBow""toBow" "toStern" : 5, => 5, => 5, "toStern" "toStern" doc.put("toPort", vessel.getStern()); "toPort" : 5, => 5, => 5, "toPort" "toPort" doc.put("toStern", vessel.getPort()); "toStarboard" : 5, => 5, doc.put("toStartboard", vessel.getStarboard()); "toStarboard" "toStarboard" => 5, "comments" : "comments" => doc.put("comments", vessel.getComments()); purposes"} "comments" => "Sample createdcreated automatically for test purposes" } "Sample vessel vessel vessel created automatically for test "Sample automatically for test purposes" } sample.py sample.php Ruby sample.java sábado 18 de febrero de 12
  • 48. Cliente Java con MongoDB ‘a pelo’ sábado 18 de febrero de 12
  • 49. 1. Obtener el Driver Importar el driver sábado 18 de febrero 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> sábado 18 de febrero de 12
  • 51. 2. Conexión Obtener la referencia a la BD y la conexión sábado 18 de febrero de 12
  • 52. 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" ); sábado 18 de febrero de 12
  • 53. 3. Inserciones Crear e insertar un objeto sábado 18 de febrero de 12
  • 54. 3. Inserciones Crear e insertar un objeto BasicDBObject doc = new BasicDBObject(); doc.put("flag", vessel.getFlag()); doc.put("name", vessel.getName()); doc.put("callsign", vessel.getCalSign()); doc.put("toBow", vessel.getBow()); doc.put("toPort", vessel.getStern()); doc.put("toStern", vessel.getPort()); doc.put("toStartboard", vessel.getStarboard()); doc.put("comments", vessel.getComments()); DBCollection coll = db.getCollection("vessel"); coll.insert(doc); sábado 18 de febrero de 12
  • 55. 4. Consultas (I) Obtener todos los documentos de una colección sábado 18 de febrero de 12
  • 56. 4. Consultas (I) Obtener todos los documentos de una colección DBCollection vessels = db.getCollection("vessel"); DBCursor cursor = vessels.find(); List<Vessel> vessels = new ArrayList<>(); while (cursor.hasNext()) { DBObject jsonVessel = cursor.next(); Vessel vessel = new Vessel(); vessel.setMmsi(jsonVessel.get(“mmsi”)); vessel.setLength(jsonVessel.get(“length”)); // ... vessels.add(vessel); } sábado 18 de febrero de 12
  • 57. 4. Consultas (I) Obtener todos los documentos de una colección DBCollection vessels = db.getCollection("vessel"); DBCursor cursor = vessels.find(); List<Vessel> vessels = new ArrayList<>(); while (cursor.hasNext()) { class DBCollection { public abstract DBObject jsonVessel = cursor.next(); public final DBCursor find(){ Vessel vessel = new Vessel(); public final DBCursor find( DBObject ref ) vessel.setMmsi(jsonVessel.get(“mmsi”)); public final DBCursor find( DBObject ref , DBObject keys ) vessel.setLength(jsonVessel.get(“length”)); // ... public final DBObject findOne( Object obj ) vessels.add(vessel); DBObject findOne( Object obj, DBObject fields ) public final } public DBObject findAndModify( DBObject query , DBObject update ) } sábado 18 de febrero de 12
  • 58. 4. Consultas (II) Consultas “SQL-like” sábado 18 de febrero de 12
  • 59. 4. Consultas (II) Consultas “SQL-like” En RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”; Las consultas se hacen también en JSON sábado 18 de febrero de 12
  • 60. 4. Consultas (II) Consultas “SQL-like” En RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”; Las consultas se hacen también en JSON { “flag” : “ALBANIA” } sábado 18 de febrero de 12
  • 61. 4. Consultas (II) Consultas “SQL-like” En RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”; Las consultas se hacen también en JSON { “flag” : “ALBANIA” } beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > use vts switched to db vts > db.vessel.find( { "flag" : "ALBANIA" }); { "_id" : "224312999", "_class" : "com.vts.model.Vessel", "flag" : "ALBANIA", "name" : "Sample TOWING Vessel 224312999", "callsign" : "SV224312999", “length”: 30, “beam” : “10”, "toBow" : 25, "toStern" : 5, "toPort" : 5, "toStarboard" : 5, "comments" : "Sample vessel created automatically for test purposes" } > sábado 18 de febrero de 12
  • 62. 4. Consultas (II) Consultas “SQL-like” En RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”; Las consultas se hacen también en JSON { “flag” : “ALBANIA” } beleriand:bin dgomez$ ./mongo MongoDB shell version: 1.8.1 connecting to: test > use vts switched to db vts DBObject query = new BasicDBObject(); query.put("flag", "ALBANIA"); > db.vessel.find( { "flag" : "ALBANIA" }); { "_id" : "224312999", "_class" : "com.vts.model.Vessel", "flag" : "ALBANIA", DBCursor albanianShips = vessels.find(query); "name" : "Sample TOWING Vessel 224312999", "callsign" : "SV224312999", “length”: 30, “beam” : “10”, "toBow" : 25, "toStern" : 5, "toPort" : 5, { while (albanianShips.hasNext()) "toStarboard" : 5, // ... "comments" : "Sample vessel created automatically for test purposes" } > } sábado 18 de febrero de 12
  • 63. Operadores de consulta Otros operadores sábado 18 de febrero de 12
  • 64. Operadores de consulta Otros operadores $all $and $exists $gt $in $lt $mod $ne $nin $nor $or $size $type sábado 18 de febrero de 12
  • 65. Consultas complejas Concatenación de consultas RDBMS: sábado 18 de febrero de 12
  • 66. Consultas complejas Concatenación de consultas SELECT * FROM VESSELS WHERE length < 90 AND length > 30 RDBMS: AND (flag = “ALBANIA” or flag = ”SAN MARINO”); sábado 18 de febrero de 12
  • 67. Consultas complejas Concatenación de consultas SELECT * FROM VESSELS WHERE length < 90 AND length > 30 RDBMS: AND (flag = “ALBANIA” or flag = ”SAN MARINO”); { “length” : { $lt : 90, $gt : 30}, Mongo: $or : [ { “flag” : “ALBANIA”}, { “flag” : “SAN MARINO”} ] } sábado 18 de febrero de 12
  • 68. Consultas complejas Concatenación de consultas SELECT * FROM VESSELS WHERE length < 90 AND length > 30 RDBMS: AND (flag = “ALBANIA” or flag = ”SAN MARINO”); { “length” : { $lt : 90, $gt : 30}, Mongo: $or : [ { “flag” : “ALBANIA”}, { “flag” : “SAN MARINO”} ] } DBObject query = new BasicDBObject(); DBObject condition = new BasicDBObject("$lt",90); condition.put("$gt",30); query.put("length", condition); DBObject [] flags = { Mongo new BasicDBObject("flag", "ALBANIA"), new BasicDBObject("flag", "SAN MARINO") }; Driver: query.put("$or", flags); talks.find(query); sábado 18 de febrero de 12
  • 69. DBObjects desde JSON com.mongo.util.JSON sábado 18 de febrero de 12
  • 70. DBObjects desde JSON com.mongo.util.JSON Object query = JSON.parse("{ 'length' : { $lt : 90, $gt : 30}, " + '$or' : [ { 'flag' : 'ALBANIA}, " + " " { 'flag' : 'SAN MARINO'} ] }"); DBCursor cursor = db.find((DBObject) query); sábado 18 de febrero de 12
  • 71. Además... Gestión de excepciones Gestión recursos DB, Collección, Cursores, DBObjects... Transformaciones Objeto JSON sábado 18 de febrero de 12
  • 72. Spring Data MongoDB sábado 18 de febrero de 12
  • 73. Spring Data Objetivo: Proporcionar un mecanismo homogéneo y completo para el acceso a BD NoSQL Multiples proyectos: Soportados: MongoDB, Redis, Neo4j, Hadoop, GemFire, RiaK En proceso: CouchDB, Hbase, Cassandra sábado 18 de febrero de 12
  • 74. Spring Data y MongoDB XML namespace para configurar driver Mongo MongoTemplate Conversión de excepciones automática Conversión Configurable JMX monitoring sábado 18 de febrero de 12
  • 75. Importando Spring Data sábado 18 de febrero de 12
  • 76. Importando Spring Data <repository> <id>spring-release</id> <name>Spring Maven Release Repository</name> <url>http://repo.springsource.org/libs-release</url> </repository> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.0.1.RELEASE</version> </dependency> sábado 18 de febrero de 12
  • 77. Namespace sábado 18 de febrero de 12
  • 78. 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> sábado 18 de febrero de 12
  • 79. 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> sábado 18 de febrero de 12
  • 80. 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> sábado 18 de febrero de 12
  • 81. MongoTemplate <bean  id="mongoTemplate"  class="org.springframework.data.mongodb.core.MongoTemplate">   <constructor-­‐arg  name="mongoDbFactory"  ref="mongoDbFactory"  /> </bean> Identifica la colección Convierte query a JSON Convierte respuesta (“_class”) Gestiona las conexiones y cursores Convierte las excepciones sábado 18 de febrero de 12
  • 82. MongoTemplate - Consultas sábado 18 de febrero de 12
  • 83. MongoTemplate - Consultas public class MongoTemplate implements MongoOperations, ApplicationContextAware { public <T> T findOne(Query query, Class<T> entityClass) public <T> List<T> find(Query query, Class<T> entityClass) public <T> T findById(Object id, Class<T> entityClass) public <T> List<T> findAll(Class<T> entityClass) } sábado 18 de febrero de 12
  • 84. MongoTemplate - Consultas public class MongoTemplate implements MongoOperations, ApplicationContextAware { public <T> T findOne(Query query, Class<T> entityClass) public <T> List<T> find(Query query, Class<T> entityClass) public <T> T findById(Object id, Class<T> entityClass) public <T> List<T> findAll(Class<T> entityClass) } public <T> T findOne(Query query, Class<T> entityClass, String collectionName) .... sábado 18 de febrero de 12
  • 85. Consultas Consultas “SQL-like” RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”; sábado 18 de febrero de 12
  • 86. Consultas Consultas “SQL-like” RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”; Las consultas se hacen también en JSON Mongo: { “flag” : “ALBANIA” } sábado 18 de febrero de 12
  • 87. Consultas Consultas “SQL-like” RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”; Las consultas se hacen también en JSON Mongo: { “flag” : “ALBANIA” } DBCollection vessels = db.getCollection("vessel"); DBObject query = new BasicDBObject(); query.put("flag", "ALBANIA"); Mongo DBCursor albanianShips = vessels.find(query); while (albanianShips.hasNext()) { Driver: DBObject result = albanianShips.next(); // Create Vessel object from DBObject } sábado 18 de febrero de 12
  • 88. Consultas Consultas “SQL-like” RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”; Las consultas se hacen también en JSON Mongo: { “flag” : “ALBANIA” } Query query = new Query(Criteria.where("flag").is("ALBANIA"); List<Vessel> vessels = mongoTemplate.find(query, Vessel.class); Utilizado para Identificación de la colección Serialización JSON sábado 18 de febrero de 12
  • 90. Serialización automática {  "_id"  :  "224000999",    "_class"  :  "com.vts.model.Vessel",    "flag"  :  "ALBANIA",    "name"  :  "Sample  NOT_AVAILABLE  Vessel  224000999",    "callsign"  :  "SV224000999",    "toBow"  :  25,    "toStern"  :  5,    "toPort"  :  5,    "toStarboard"  :  5,    "comments"  :  "Sample  vessel  created  automatically  for  test  purposes"  } sábado 18 de febrero de 12
  • 91. Consultas complejas Concatenación de consultas sábado 18 de febrero de 12
  • 92. Consultas complejas Concatenación de consultas SELECT * FROM VESSELS WHERE length < 90 AND length > 30 ORDER BY lastUpdate; sábado 18 de febrero de 12
  • 93. Consultas complejas Concatenación de consultas SELECT * FROM VESSELS WHERE length < 90 AND length > 30 ORDER BY lastUpdate; { “length” : { $lt : 90, $gt : 30} } sábado 18 de febrero de 12
  • 94. Consultas complejas Concatenación de consultas SELECT * FROM VESSELS WHERE length < 90 AND length > 30 ORDER BY lastUpdate; { “length” : { $lt : 90, $gt : 30} } DBObject query = new BasicDBObject(); DBObject condition = new BasicDBObject("$lt",90); condition.put("$gt",30); query.put("length", condition); DBObject [] flags = { new BasicDBObject("flag", "ALBANIA"), new BasicDBObject("flag", "SAN MARINO") }; query.put("$or", flags); vessels.find(query); sábado 18 de febrero de 12
  • 95. Consultas complejas Concatenación de consultas SELECT * FROM VESSELS WHERE length < 90 AND length > 30 ORDER BY lastUpdate; { “length” : { $lt : 90, $gt : 30} } sábado 18 de febrero de 12
  • 96. Consultas complejas Concatenación de consultas SELECT * FROM VESSELS WHERE length < 90 AND length > 30 ORDER BY lastUpdate; { “length” : { $lt : 90, $gt : 30} } Criteria criteria = Criteria.where("length"); criteria.gte(from); criteria.lte(to); Query query = new Query(criteria); query.sort().on("lastUpdate", Order.ASCENDING); List<Vessel> vessels = mongoTemplate.find(query, Vessel.class); sábado 18 de febrero de 12
  • 97. MongoTemplate - inserciones sábado 18 de febrero de 12
  • 98. MongoTemplate - inserciones public class MongoTemplate implements MongoOperations, ApplicationContextAware { public void save(Object objectToSave) public void save(Object objectToSave, String collectionName) } sábado 18 de febrero de 12
  • 100. AbstractRepository public abstract class AbstractMongoRepository<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 String determineCollection() { return persistentClass.getSimpleName(); } } sábado 18 de febrero de 12
  • 102. AbstractRepository public abstract class AbstractMongoRepository<T> { public void save(T e) { mongoTemplate.save(e, determineCollection()); } public void save(Collection<T> entities) { for (T e : entities) { save(e); } } public void removeById(String id) { Object e = findById(id); if (e != null) { mongoTemplate.remove(e, determineCollection()); } } public T findById(String id) { T t = mongoTemplate.findById(id, persistentClass); if (t == null) { throw new ObjectNotFoundException(persistentClass, id); } return t; } } sábado 18 de febrero de 12
  • 104. VesselRepository public class VesselRepository extends AbstractMongoRepository<Vessel> { public VesselRepository() { super(Vessel.class); } } sábado 18 de febrero de 12
  • 105. A tener en cuenta sábado 18 de febrero de 12
  • 106. El caso de BitSet Cuidado con los campos transient sábado 18 de febrero de 12
  • 107. El caso de BitSet Cuidado con los campos transient public class BitSet implements Cloneable, java.io.Serializable { /** The internal field corresponding to the serialField "bits". */ */ private long[] words; /** The number of words in the logical size of this Bitset */ private transient int wordsInUse = 0; private void expandTo(int wordIndex) { int wordsRequired = wordIndex+1; if (wordsInUse < wordsRequired) { ensureCapacity(wordsRequired); wordsInUse = wordsRequired; } } } sábado 18 de febrero de 12
  • 108. Conversión Manual sábado 18 de febrero de 12
  • 109. Conversión Manual 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;   } } sábado 18 de febrero de 12
  • 110. Conversión Manual Porque a veces lo automático no funciona sábado 18 de febrero de 12
  • 111. 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> sábado 18 de febrero de 12
  • 112. Queries con multiples valores sábado 18 de febrero de 12
  • 113. Queries con multiples valores Query query = new Query( Criteria .where("length").gte(20) .and("length").lt(60)); sábado 18 de febrero de 12
  • 114. Queries con multiples valores Query query = new Query( Criteria .where("length").gte(20) .and("length").lt(60)); DEBUG MongoTemplate - find using query: { "length" : { "$lt" : 60} } sábado 18 de febrero de 12
  • 115. Queries con multiples valores sábado 18 de febrero de 12
  • 116. Queries con multiples valores Query query = new Query( Criteria .where("length").gte(20).lte(60)); sábado 18 de febrero de 12
  • 117. Queries con multiples valores Query query = new Query( Criteria .where("length").gte(20).lte(60)); DEBUG MongoTemplate - find using query: { "toBow" : { "$gte" : 20 , "$lte" : 60} } sábado 18 de febrero de 12
  • 118. Conclusiones Reducción del número de tablas (87x2 vs 5) Optimización en el rendimiento de escrituras Simplificación de los DAOs con Spring-Data Otras ventajas: Documentos en formato de Respuesta REST interfaz Javascript en la consola sábado 18 de febrero de 12
  • 119. Q&A David Gómez @dgomezg sábado 18 de febrero de 12