Este documento presenta una introducción a MongoDB, una base de datos orientada a documentos de código abierto. Se explica brevemente qué es MongoDB, sus características como rendimiento alto, escalabilidad horizontal y funcionalidades. Luego, se muestra cómo crear una aplicación Java simple para almacenar y consultar informes sobre pistas de esquí usando MongoDB. Finalmente, se indican algunos temas adicionales sobre MongoDB como índices, replicación, sharding y cursos en línea disponibles.
2. Agenda
• Que és MongoDB?
• Base de Datos Orientada a Documentos
• Informes sobre Pistas de Esqui App
• Aggregation Framework
• MongoDB Drivers
• Indices, Replicacion, Sharding
4. MongoDB és una base de datos
…
• BD Orientada a Documentos
• Codigo abierto
• Alto rendimiento
• Escalabilidad horizontal
• Llena de funcionalidade
5. 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 )
6. 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!
7. 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
9. Funcionalidades
• Consultas Ad Hoc
• Agregación en tiempo real
• Consistente
• Capacidades de consulta Geoespacial
• Suporte para las lenguages de programación
mas utilizadas
• Modelo / Esquema flexible
17. Vamos a crear una applicacíon
de informes de pistas de esqui
http://images.nationalgeographic.com/wpf/media-
live/photos/000/327/cache/adventure-ski-snowboard-pictures-
20_32703_600x450.jpg
18. Que queremos hacer?
• Guardar informes sobre pistas
• Buscar los informes actuales de pistas
• Actualizar la precision del informe
• Las mejores pistas
21. Conectar con la Base de Datos
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” );
Lista de Servidores
Objecto BD Pool de Conexiones
Objecto Collection
(Replica Set)
22. Insertar documentos
Mongo m = MongoClient( “localhost”, 27017 );
DB db = m.getDB(“esqui”);
DBCollection coll = db.getCollection(“informes”);
coll.insert( report ); Insertar nuevo informe
//vamos a recuperar para ver que insertamos
BasicDBObject outReport = coll.findOne();
System.out.println(outReport);
Recuperamos el
documento de la BD
>>{ "_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}}
23. Buscar informe de pista mas
cercana - shell
>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 la pista mas cercana
• Buscar por el informe de hoy
• Enseñar solo el nombre y las condiciones de pista
• Ordenar por temperatura
24. Buscar informe de pista mas
cercana - Java
DBObject fields = new BasicDBObject();
//si no queremos _id tenemos que decir explicitamente
fields.put("_id", 0);
Ordenar descendente temperatura
Campos quepor de hoy enseñar
Buscar queremos
Fecha proximidad
fields.put("conditions", 1);
fields.put("location.name", 1);
DBObject filter = new BasicDBObject();
{
//near part location.coordinates: {
date: { 0,
_id:
DBObject near = new BasicDBObject(); { conditions.temperature: -1 }
$near: [long, lat]
$gte: ISODate(2013, 2, 12)
conditions: 1,
near.put("$near", new double[]{ longitude, latitude }); }
} location.name: 1
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);
25. Actualizar la precision de un
reporter
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);
Retornamos el estado anterior Añadimos nuevo campo
Para un determinado reporter
al update incrementando su valor
>db.informes.find({“reporter”: “wingman”}, {“accuracy”:1, “_id”:0})
{ ”accuracy" : 1}
Si buscamos en la BD podemos confirmar que se
aplica el nuevo campo con el incremento correcto
28. Aggregation Framework
• Se declara en JSON, se executa en C++
• Flexible, funcional y simple
– Operaciones en pipeline
– Expresiones computacionales
• Integracion completa con sharding
29. 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
32. 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
33. Numero de pistas esquiables
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());
} El resultado del comando es un documento
return (DBObject) ouptut.getCommandResult().get("result");
Agregamos por tipo de nieve sumando lo numero de pistas con las mismas
Filtramos por temperatura y viento
Executamos el comando de agregacion
condiciones
40. MongoDB drivers
• Soporte oficial hasta12 lenguages
• La comunidad tiene muchas otras
• Drivers conectan tu App a MongoDB server
• Drivers traducen objectos y estruturas de datos
en BSON
• La instalacion de los mismos sigue los standards
del ecosistema (npm, pecl, gem, pip)