SlideShare a Scribd company logo
1 of 119
Download to read offline
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

More Related Content

What's hot

XPages Workshop: Concepts And Exercises
XPages Workshop:   Concepts And ExercisesXPages Workshop:   Concepts And Exercises
XPages Workshop: Concepts And Exercisesddrschiw
 
DB2 pureScale Technology Preview
DB2 pureScale Technology PreviewDB2 pureScale Technology Preview
DB2 pureScale Technology PreviewCristian Molaro
 
Java database connectivity with MYSQL
Java database connectivity with MYSQLJava database connectivity with MYSQL
Java database connectivity with MYSQLAdil Mehmoood
 
EDB Failover Manager for Seamless Failover & Switchover
EDB Failover Manager for Seamless Failover & SwitchoverEDB Failover Manager for Seamless Failover & Switchover
EDB Failover Manager for Seamless Failover & SwitchoverAshnikbiz
 
.Net Core - not your daddy's dotnet
.Net Core - not your daddy's dotnet.Net Core - not your daddy's dotnet
.Net Core - not your daddy's dotnetRick van den Bosch
 
Clean architecture
Clean architectureClean architecture
Clean architectureLieven Doclo
 
Oracle GoldenGate 21c New Features and Best Practices
Oracle GoldenGate 21c New Features and Best PracticesOracle GoldenGate 21c New Features and Best Practices
Oracle GoldenGate 21c New Features and Best PracticesBobby Curtis
 
Oracle E-Business Suite R12.2.5 on Database 12c: Install, Patch and Administer
Oracle E-Business Suite R12.2.5 on Database 12c: Install, Patch and AdministerOracle E-Business Suite R12.2.5 on Database 12c: Install, Patch and Administer
Oracle E-Business Suite R12.2.5 on Database 12c: Install, Patch and AdministerAndrejs Karpovs
 
Micro services Architecture
Micro services ArchitectureMicro services Architecture
Micro services ArchitectureAraf Karsh Hamid
 
Microservices Design Patterns Explained | Edureka
Microservices Design Patterns Explained | EdurekaMicroservices Design Patterns Explained | Edureka
Microservices Design Patterns Explained | EdurekaEdureka!
 
Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...
Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...
Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...Sandesh Rao
 
CONEXION VISUAL STUDIO.NET - SQL SERVER
CONEXION VISUAL STUDIO.NET - SQL SERVERCONEXION VISUAL STUDIO.NET - SQL SERVER
CONEXION VISUAL STUDIO.NET - SQL SERVERDarwin Durand
 
Size Matters-Best Practices for Trillion Row Datasets on ClickHouse-2202-08-1...
Size Matters-Best Practices for Trillion Row Datasets on ClickHouse-2202-08-1...Size Matters-Best Practices for Trillion Row Datasets on ClickHouse-2202-08-1...
Size Matters-Best Practices for Trillion Row Datasets on ClickHouse-2202-08-1...Altinity Ltd
 
[❤PDF❤] Oracle 19c Database Administration Oracle Simplified
[❤PDF❤] Oracle 19c Database Administration Oracle Simplified [❤PDF❤] Oracle 19c Database Administration Oracle Simplified
[❤PDF❤] Oracle 19c Database Administration Oracle Simplified ZanderHaney
 
Building a High-Performance Distributed Task Queue on MongoDB
Building a High-Performance Distributed Task Queue on MongoDBBuilding a High-Performance Distributed Task Queue on MongoDB
Building a High-Performance Distributed Task Queue on MongoDBMongoDB
 
Load Balancing MySQL with HAProxy - Slides
Load Balancing MySQL with HAProxy - SlidesLoad Balancing MySQL with HAProxy - Slides
Load Balancing MySQL with HAProxy - SlidesSeveralnines
 
Conexion con visual basic 6.0
Conexion con visual basic 6.0Conexion con visual basic 6.0
Conexion con visual basic 6.0josecoronel38
 

What's hot (20)

XPages Workshop: Concepts And Exercises
XPages Workshop:   Concepts And ExercisesXPages Workshop:   Concepts And Exercises
XPages Workshop: Concepts And Exercises
 
DB2 pureScale Technology Preview
DB2 pureScale Technology PreviewDB2 pureScale Technology Preview
DB2 pureScale Technology Preview
 
Java database connectivity with MYSQL
Java database connectivity with MYSQLJava database connectivity with MYSQL
Java database connectivity with MYSQL
 
EDB Failover Manager for Seamless Failover & Switchover
EDB Failover Manager for Seamless Failover & SwitchoverEDB Failover Manager for Seamless Failover & Switchover
EDB Failover Manager for Seamless Failover & Switchover
 
.Net Core - not your daddy's dotnet
.Net Core - not your daddy's dotnet.Net Core - not your daddy's dotnet
.Net Core - not your daddy's dotnet
 
Sql Antipatterns Strike Back
Sql Antipatterns Strike BackSql Antipatterns Strike Back
Sql Antipatterns Strike Back
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Oracle GoldenGate 21c New Features and Best Practices
Oracle GoldenGate 21c New Features and Best PracticesOracle GoldenGate 21c New Features and Best Practices
Oracle GoldenGate 21c New Features and Best Practices
 
Oracle E-Business Suite R12.2.5 on Database 12c: Install, Patch and Administer
Oracle E-Business Suite R12.2.5 on Database 12c: Install, Patch and AdministerOracle E-Business Suite R12.2.5 on Database 12c: Install, Patch and Administer
Oracle E-Business Suite R12.2.5 on Database 12c: Install, Patch and Administer
 
Getting started with entity framework
Getting started with entity framework Getting started with entity framework
Getting started with entity framework
 
Micro services Architecture
Micro services ArchitectureMicro services Architecture
Micro services Architecture
 
Microservices Design Patterns Explained | Edureka
Microservices Design Patterns Explained | EdurekaMicroservices Design Patterns Explained | Edureka
Microservices Design Patterns Explained | Edureka
 
Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...
Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...
Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...
 
CONEXION VISUAL STUDIO.NET - SQL SERVER
CONEXION VISUAL STUDIO.NET - SQL SERVERCONEXION VISUAL STUDIO.NET - SQL SERVER
CONEXION VISUAL STUDIO.NET - SQL SERVER
 
Size Matters-Best Practices for Trillion Row Datasets on ClickHouse-2202-08-1...
Size Matters-Best Practices for Trillion Row Datasets on ClickHouse-2202-08-1...Size Matters-Best Practices for Trillion Row Datasets on ClickHouse-2202-08-1...
Size Matters-Best Practices for Trillion Row Datasets on ClickHouse-2202-08-1...
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Framework
 
[❤PDF❤] Oracle 19c Database Administration Oracle Simplified
[❤PDF❤] Oracle 19c Database Administration Oracle Simplified [❤PDF❤] Oracle 19c Database Administration Oracle Simplified
[❤PDF❤] Oracle 19c Database Administration Oracle Simplified
 
Building a High-Performance Distributed Task Queue on MongoDB
Building a High-Performance Distributed Task Queue on MongoDBBuilding a High-Performance Distributed Task Queue on MongoDB
Building a High-Performance Distributed Task Queue on MongoDB
 
Load Balancing MySQL with HAProxy - Slides
Load Balancing MySQL with HAProxy - SlidesLoad Balancing MySQL with HAProxy - Slides
Load Balancing MySQL with HAProxy - Slides
 
Conexion con visual basic 6.0
Conexion con visual basic 6.0Conexion con visual basic 6.0
Conexion con visual basic 6.0
 

Viewers also liked

Buenas prácticas para pequeños/medianos operadores de telefonía basados en Op...
Buenas prácticas para pequeños/medianos operadores de telefonía basados en Op...Buenas prácticas para pequeños/medianos operadores de telefonía basados en Op...
Buenas prácticas para pequeños/medianos operadores de telefonía basados en Op...PaloSanto Solutions
 
Codemotion 2013 - Quiero tiempo real y lo quiero para ayer
Codemotion 2013 - Quiero tiempo real y lo quiero para ayerCodemotion 2013 - Quiero tiempo real y lo quiero para ayer
Codemotion 2013 - Quiero tiempo real y lo quiero para ayerIván López Martín
 
Sistema de préstamo
Sistema de préstamoSistema de préstamo
Sistema de préstamoBiblioteca2
 
MongoDB + Java + Spring Data
MongoDB + Java + Spring DataMongoDB + Java + Spring Data
MongoDB + Java + Spring DataAnton Sulzhenko
 
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!Iván López Martín
 
Características MONGO DB
Características MONGO DBCaracterísticas MONGO DB
Características MONGO DBmaxfontana90
 
movimiento uniformemente acelerado
movimiento uniformemente aceleradomovimiento uniformemente acelerado
movimiento uniformemente aceleradoJessikaMtz94
 
PostgreSQL - Lección 8 - Manipulando Datos y Transacciones
PostgreSQL - Lección 8 - Manipulando Datos y TransaccionesPostgreSQL - Lección 8 - Manipulando Datos y Transacciones
PostgreSQL - Lección 8 - Manipulando Datos y TransaccionesNicola Strappazzon C.
 
What Makes Great Infographics
What Makes Great InfographicsWhat Makes Great Infographics
What Makes Great InfographicsSlideShare
 
Masters of SlideShare
Masters of SlideShareMasters of SlideShare
Masters of SlideShareKapost
 
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareSTOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareEmpowered Presentations
 
10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation OptimizationOneupweb
 
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content MarketingHow To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content MarketingContent Marketing Institute
 

Viewers also liked (20)

Presentacion BD NoSQL
Presentacion  BD NoSQLPresentacion  BD NoSQL
Presentacion BD NoSQL
 
Buenas prácticas para pequeños/medianos operadores de telefonía basados en Op...
Buenas prácticas para pequeños/medianos operadores de telefonía basados en Op...Buenas prácticas para pequeños/medianos operadores de telefonía basados en Op...
Buenas prácticas para pequeños/medianos operadores de telefonía basados en Op...
 
Mongo Mapper
Mongo MapperMongo Mapper
Mongo Mapper
 
Codemotion 2013 - Quiero tiempo real y lo quiero para ayer
Codemotion 2013 - Quiero tiempo real y lo quiero para ayerCodemotion 2013 - Quiero tiempo real y lo quiero para ayer
Codemotion 2013 - Quiero tiempo real y lo quiero para ayer
 
Sistema de préstamo
Sistema de préstamoSistema de préstamo
Sistema de préstamo
 
Spring ORM
Spring ORMSpring ORM
Spring ORM
 
MongoDB + Java + Spring Data
MongoDB + Java + Spring DataMongoDB + Java + Spring Data
MongoDB + Java + Spring Data
 
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!
 
Spring boot et. al. para el impaciente
Spring boot et. al. para el impacienteSpring boot et. al. para el impaciente
Spring boot et. al. para el impaciente
 
Características MONGO DB
Características MONGO DBCaracterísticas MONGO DB
Características MONGO DB
 
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4jBases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
 
slide share
slide shareslide share
slide share
 
movimiento uniformemente acelerado
movimiento uniformemente aceleradomovimiento uniformemente acelerado
movimiento uniformemente acelerado
 
PostgreSQL - Lección 8 - Manipulando Datos y Transacciones
PostgreSQL - Lección 8 - Manipulando Datos y TransaccionesPostgreSQL - Lección 8 - Manipulando Datos y Transacciones
PostgreSQL - Lección 8 - Manipulando Datos y Transacciones
 
What Makes Great Infographics
What Makes Great InfographicsWhat Makes Great Infographics
What Makes Great Infographics
 
Masters of SlideShare
Masters of SlideShareMasters of SlideShare
Masters of SlideShare
 
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareSTOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
 
You Suck At PowerPoint!
You Suck At PowerPoint!You Suck At PowerPoint!
You Suck At PowerPoint!
 
10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization
 
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content MarketingHow To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
 

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

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

Recently uploaded

POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 

Recently uploaded (13)

POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 

Por qué MongoDB: caso real de tráfico marítimo

  • 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