webinar: creación de su primera aplicación java con mongodb

Post on 03-Jul-2015

2.331 Views

Category:

Technology

7 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Solutions Architect, 10gen

Norberto Leite

#mongodbwebinar

Primera Aplicacíon Java con MongoDB

Agenda

• Que és MongoDB?

• Base de Datos Orientada a Documentos

• Informes sobre Pistas de Esqui App

• Aggregation Framework

• MongoDB Drivers

• Indices, Replicacion, Sharding

MongoDB, esto que és?

MongoDB és una base de datos…

• BD Orientada a Documentos

• Codigo abierto

• Alto rendimiento

• Escalabilidad horizontal

• Llena de funcionalidade

BD Orientada a Documentos

• Un documento és una extructura de datos

• Documento == JSON object

• Documento == PHP Array

• Documento == Python Dict

• Documento == Ruby Hash

• Documento == DBObject (JAVA )

Codigo Abierto

• MongoDB és un proyecto open source– https://www.github.com/mongodb

• Licencia AGPL

• 10gen és responsable por su desarrollo

• Licencias comerciales disponibles

• Contribuiciones? Bienvenidas!

Alto Rendimiento

• C++

• Basado en el uso extensivo de memory-mapped files .

• Multiplataforma– Windows, Linux, Mac, Solaris(Joyent)

– Cloud, virtual, shared, private, physical servers

• BSON (formato binario de JSON)

• Indices primários y secondários

• Document model = less work

Escalabilidad Horizontal

Funcionalidades

• Consultas Ad Hoc

• Agregación en tiempo real

• Consistente

• Capacidades de consulta Geoespacial

• Suporte para las lenguages de programaciónmas utilizadas

• Modelo / Esquema flexible

http://www.mongodb.org/downloads

Mongo Shell

Base de Datos Orientada a Documentos

RDBMS MongoDB

Table, View ➜ Collection

Row ➜ Document

Index ➜ Index

Join ➜ Embedded Document

Foreign Key ➜ Reference

Partition ➜ Shard

Terminologia

Tradicional (relational) DER

MongoDB DER

Estado De Pistas App

http://images.nationalgeographic.com/wpf/media-

live/photos/000/327/cache/adventure-ski-snowboard-pictures-

20_32703_600x450.jpg

Vamos a crear una applicacíonde informes de pistas de esqui

Que queremos hacer?

• Guardar informes sobre pistas

• Buscar los informes actuales de pistas

• Actualizar la precision del informe

• Las mejores pistas

{

_id = ObjectId("4fff33619ef172b68a000004"),

reporter: "wingman",

location:{

coordinates: [42.774031,-0.364158],

name: “Formigal”,

country: “ESP”

},

conditions: {

snow: “polvo”,

wind: “moderate”,

temperature: -2

},

date: ISODate(“2013-02-12T15:00:00Z”)

}

Documento Informe

Clave Primaria

Índice geoespacial

Índice compuesto

TTL Índice

BasicDBObject report = new BasicDBObject();

report.put(“reporter”, “wingman”);

report.put(“date”, new Date());

BasicDBObject location = new BasicDBObject();

location.put(“name”, “Formigal”);

location.put(“country”, “ESP”);

location.put(“coordinates”, new double[]{42.774031,-0.364158});

BasicDBObject conditions = new BasicDBObject();

conditions.put(“snow”, “polvo”);

conditions.put(“wind”, “moderado”);

conditions.put(“temperature”, -2);

report.put(“conditions”, conditions);

report.put(“location”, location);

Java: DBObjects

{

reporter: “wingman”,

date: ISODate(“20130212”),

}

{

name: “Formigal”,

country: “ESP”,

coordinates: [42.774031,-0.364158],

}

{

snow:”polvo”,

wind:”moderado”,

temperature: -2

}

{

reporter:”wingman”,

date:”ISODate(“20130212”),

conditions:{

snow:”polvo”,

wind:”moderado”,

temperature: -2

},

location:{

name: “Formigal”,

country: “ESP”,

coordinates:[42.774031,-

0.364158],

}

}

List<ServerAddress> serverList = new List<ServerAddress>();

serverList.add( new ServerAddress( “localhost”, 27017 ) );

serverList.add( new ServerAddress( “localhost”, 27018 ) );

serverList.add( new ServerAddress( “localhost”, 27019 ) );

MongoClient m = new MongoClient( serverList )

DB db = m.get( “esqui” );

DBCollection collection = db.getCollection( “informes” );

Conectar con la Base de Datos

Lista de Servidores

(Replica Set)Pool de ConexionesObjecto BD Objecto Collection

Mongo m = MongoClient( “localhost”, 27017 );

DB db = m.getDB(“esqui”);

DBCollection coll = db.getCollection(“informes”);

coll.insert( report );

//vamos a recuperar para ver que insertamos

BasicDBObject outReport = coll.findOne();

System.out.println(outReport);

>>{ "_id" : { "$oid" : "51193452a0ee57d0766a533c"} , "reporter" : "wingman" , "date" : { "$date" : "2013-02-11T18:11:30.298Z"} , "location" : { "coordinates" : [ 42.774031 , -0.364158] , "name" : "formigal" , "country" : "ESP"} , "conditions" : { "snow" : "polvo" , "wind" : "moderate" , "temperature" : -2}}

Insertar documentos

Insertar nuevo informe

Recuperamos el

documento de la BD

>db.informes.find( {

“location.coordinates”: { $near: [40.724511,-73.997254] },

“date: {$gte: new Date(2013, 02, 12) } } ,

{ “location.name”: 1, “conditions”: 1, _id: 0}

).sort( { “conditions.temperature”: -1 } )

Buscar informe de pista mas cercana - shell

• Buscar la pista mas cercana

• Buscar por el informe de hoy

• Enseñar solo el nombre y las condiciones de pista

• Ordenar por temperatura

DBObject fields = new BasicDBObject();

//si no queremos _id tenemos que decir explicitamente

fields.put("_id", 0);

fields.put("conditions", 1);

fields.put("location.name", 1);

DBObject filter = new BasicDBObject();

//near part

DBObject near = new BasicDBObject();

near.put("$near", new double[]{ longitude, latitude });

filter.put("location.coordinates", near);

DBObject gte = new BasicDBObject("$gte", new Date(2013, 2, 12));

filter.put( “date”, gte);

DBObject orderBy = new BasicDBObject();

orderBy.put("location.temperature", -1);

return coll.find(filter, fields).sort(orderBy);

Buscar informe de pista mas cercana - Java

Campos que queremos enseñar

{

_id: 0,

conditions: 1,

location.name: 1

}

Buscar por proximidad

location.coordinates: {

$near: [long, lat]

}

Fecha de hoy

date: {

$gte: ISODate(2013, 2, 12)

}

Ordenar descendente temperatura

{ conditions.temperature: -1 }

DBObject query = new BasicDBObject("reporter", reporter);

DBObject accuracy = new BasicDBObject("accuracy", 1);

DBObject update = new BasicDBObject( "$inc" , inc );

//retorna el valor anterior al cambio

return coll.findAndModify(query, update);

>db.informes.find({“reporter”: “wingman”}, {“accuracy”:1, “_id”:0})

{ ”accuracy" : 1}

Actualizar la precision de un reporter

Para un determinado reporterAñadimos nuevo campo

incrementando su valor

Retornamos el estado anterior

al update

Si buscamos en la BD podemos confirmar que se

aplica el nuevo campo con el incremento correcto

Un poco de analytics

Aggregation Framework

Aggregation Framework

• Se declara en JSON, se executa en C++

• Flexible, funcional y simple– Operaciones en pipeline

– Expresiones computacionales

• Integracion completa con sharding

Pipeline

• Procesamiento de documentos en cadena– Se ejecuta sobre una collection

– El resultado final és un documento

• Contiene una serie de operadores– Fitran y cambian datos

– El resultado del primero son los datos de entrada del

siguiente

ps ax | grep mongod | head -n 1

Operadores

• $match

• $project

• $group

• $unwind

• $sort

• $limit

• $skip

Cual es el numero de

pistas esquiables?

Numero de pistas esquiables

• Las que tienen informes favorables– Pistas solamente con viento “moderado”

– Temperatura nunca por debajo de los -5

• Agrupar por tipo de nieve

DBObject matchTemperature = new BasicDBObject("$match", new BasicDBObject( "conditions.temperature", new BasicDBObject("$gte", minTemperature ) ) );

DBObject matchWind = new BasicDBObject( "$match", new BasicDBObject("wind", "moderado") );

DBObject groupBy = new BasicDBObject("_id", "$conditions.snow");

groupBy.put("sum", new BasicDBObject( "$sum", 1 ) );

DBObject group = new BasicDBObject("$group", groupBy );

AggregationOutput ouptut = coll.aggregate(matchWind, matchTemperature, group);

if (!ouptut.getCommandResult().ok()){

throw new Exception(ouptut.getCommandResult().getErrorMessage());

}

return (DBObject) ouptut.getCommandResult().get("result");

Numero de pistas esquiables

Filtramos por temperatura y vientoAgregamos por tipo de nieve sumando lo numero de pistas con las mismas

condicionesExecutamos el comando de agregacion

El resultado del comando es un documento

MongoDB Drivers

Si JAVA no es la unica

lenguage de

programacion que te

gusta

MongoDB tiene drivers

para las lenguages más

utilizadas, soportadas

por 10gen!

Y muchas otras

soportadas por la

comunidad

MongoDB drivers

• Soporte oficial hasta12 lenguages

• La comunidad tiene muchas otras

• Drivers conectan tu App a MongoDB server

• Drivers traducen objectos y estruturas de datosen BSON

• La instalacion de los mismos sigue los standards del ecosistema (npm, pecl, gem, pip)

Cursos Online

https://education.10gen.com/courses/10gen/M101J/2013_Spring/about

Java Developers: 25/02/2013

Que más ?

Hay un mundo de temas

por explorar en lo que

toca a MongoDB

Diseño de Esquema (DRE)

Indices

Replicacion – Alta Disponibilidad

Sharding – EscalabilidadeHorizontal

@nleite - norberto@10gen.com

Norberto Leite

#mongodbwebinar

Cuestiones?

Solutions Architect, 10gen

top related