webinar: creación de su primera aplicación java con mongodb
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