Download - NOSQL: Primeros Pasos en MongoDB
NOSQL: Primeros Pasos con MongoDB
• Sobre el Ponente• ¿Qué es eso del NOSQL?• Hablemos de MongoDB• Pero haz ya una SELECT• ¿Tercera forma normal?• Rendimiento… Indexame• Agregar datos en MongoDB• Java, Python, Javascript,…• Más, más, más…• Herramientas• Quiero aprender más
Índice de Contenidos
Responsable del Área QAArquitecto TécnicoISBAN. Grupo Santander
Programador, Arquitecto IT, álter ego de Línea de Código, amante de las tecnologías, generador de conocimiento y facilitador del aprendizaje.
http://lineadecodigo.comhttp://www.victorcuervo.com
Sobre el ponente: Víctor Cuervo
¿Qué es eso del NOSQL?
NOSQL es una evolución del sistema clásico de bases de datos relacionales cuya principal característica es que no se requiere una definición inicial de las estructuras sobre las que se almacenarán los datos.
¿Qué es NOSQL?
¿Por qué se llega a NOSQL?
• Evolución del modelo entidad-relación para el soporte de estructuras variables en el tiempo.
• Alternativas• Meta-modelos en ER• Bases de datos de objetos• Bases de datos XML / XQuery
Tipos de Bases de Datos NOSQL
• Columna• Hadoop/HBase, Cassandra
• Documento• MongoDB, CouchDB
• Clave/Valor• DynamoDB, Redis
• Grafos• Neo4j, Infinite Graph
http://nosql-database.org
Quiero usar NOSQL… dame ejemplos
• Ejemplo Básico…• Información de redes sociales• Logs
• … y en la industria• Polimorfismo de datos
¿Polimorfismo y NOSQL?
Persona
NombreApellido1Apellido2
Persona
NombreMiddle NameApellido
Domicilio
CalleComunidadPaís Domicilio
CalleCondadoPaís
Producto 1
Valor InicialValor Final
Producto 2
ValorEstadoDemandante
Producto3
Regla
Domicilio
CalleRegiónPaís
Hablemos de MongoDB
¿Qué es MongoDB?
• MongoDB es una base de datos NOSQL orientada a documentos.
• Desarrollada por 10gen (ahora llamados MongoDB).
• Características• Flexibilidad de los Modelos• Alto Rendimiento, Alta Disponibilidad• Escalabilidad
BSON su modelo de documentos
• El modelo de documentos se basa en el estándar JSON/BSON.
• BSON es una serialización binaria del JSON• Características de BSON
• Permite tener documentos dentro de documentos
• Podemos definir arrays dentro de documentos
• http://bsonspec.org/
Documento BSON
{ _id: "joe",name: "Joe Bookreader",addresses: [
{street: "123 Fake Street",city: "Faketon",state: "MA",zip: 12345
}, {
street: "1 Some Other Street",city: "Boston",state: "MA",zip: 12345
}]}
Instalar MongoDB
• Distribuciones para MacOS, Linux (Ubuntu, Debian,…) y Windows. Ejecuta en plataformas 32-bits y 64-bits
• Se puede descargar desde http://www.mongodb.org/downloads
• Documentación de instalación en http://docs.mongodb.org/manual/installation/
Ejecutar MongoDB
mongodNos permite arrancar el servidor de MongoDBEscucha en el puerto 27017
mongoEjecuta la consola de MongoDB
En http://www.mongodb.org/downloads se puede encontrar una consola de pruebas.
SQL Terms/Concepts MongoDB Terms/Concepts
database database
table collection
row document or BSON document
column field
index index
table joins embedded documents and linking
primary keySpecify any unique column or column combination as primary key.
primary keyIn MongoDB, the primary key is automatically set to the _id field.
aggregation (e.g. group by)aggregation pipelineSee the SQL to Aggregation Mapping Chart.
Conceptos Básicos
Pero haz ya una SELECT
Modelo de pruebas
{"_id" : ObjectId("525ab02733b01a66a9dcbc60"),"ciudad" : "Malaga","habitantes" : 567433
}{
"_id" : ObjectId("525ab02733b01a66a9dcbc61"),"ciudad" : "Murcia","habitantes" : 441354
}{
"_id" : ObjectId("525ab02733b01a66a9dcbc62"),"ciudad" : "Palma de Mallorca","habitantes" : 407648
}
Consultas, función find
Las consultas se ejecutan mediante la función find:
db.ciudades.find({ciudad:'Madrid'});
Consultas con operadores
Podemos utilizar operadores dentro de las consultas:
db.ciudades.find({habitantes:{$lt:400000}
});
db.ciudades.find({habitantes:{$gt:1000000}
});
Combinar operadores
El documento de consulta puede combinar varios operadores:
db.ciudades.find({ciudad:/^M/,habitantes:{$lt:1000000}
});
db.ciudades.find({$or:[{ciudad:/^M/},{ciudad:/^Z/}]
});
Sort para ordenar resultados
Ascendente (1) o descendente (-1)
db.ciudades.find().sort({ciudad:1
});db.ciudades.find().sort({
ciudad:-1});
Limit para limitar las consultas
Recibe el número de elementos a limitar en la consulta como parámetro.
db.ciudades.find().limit(4);
IN para consulta de elementos
Los elementos de los valores están en un array:
db.ciudades.find({ciudad:{$in:
['Avila','Zamora','Madrid']}});
Busquedas por Like
Uso de expresiones regulares para buscar por like:
db.ciudades.find({ciudad:/^M/});db.ciudades.find({ciudad:/r/});db.ciudades.find({ciudad:/d$/});
Projection o selección de datos
Projection nos permite escoger que campos devolver del documento
db.ciudades.find({habitantes:{$gt:1000000}},{ciudad:1});
db.ciudades.find({habitantes:{$gt:1000000}},{ciudad:1,_id:0});
Saltarnos datos con SKIP
Recibe como parámetro los elementos a saltar:
db.ciudades.find().skip(2);
Insertar datos
Utilizamos la función Insert
db.ciudades.insert({'ciudad':'Avila','habitantes':58915
});
Actualizar datos
Utilizamos la función Update:
db.ciudades.update({ciudad:'Avila'},{$set:{habitantes:58915}
});
Actualizaciones Múltiples
Por defecto MongoDB solo actualiza un documento:
db.ciudades.update({habitantes:{$gt:600000}},{$set:{'grande':true}},{multi:true}
);
Upsert: Actualiza si no Inserta
La función upsert actualiza un documento, si no está lo inserta.
db.ciudades.update({ciudad:'Zamora'},{$set:{habitantes:65362}},{upsert:true}
);
Borrado de datos
Utiliza la función delete. Por defecto borra todos los documentos, al menos que especifiquemos otra cosa.
db.ciudades.delete({ciudad:'Zamora'},);
db.ciudades.delete({habitantes:{$lt:400000}
},1);
Dot Notation
MongoDB utiliza la anotación del punto para acceder a campos de subdocumentos y a elementos de arrays:
array.indice
subdocumento.campo
$push, $pull, $addtoset,…
Operadores que nos sirven para el manejo de arrays:
db.ciudades.update({ ciudad: “Avila" },{ $push: { monumentos:
{ $each:[ ‘Murallas’,’La Santa’,’San Vicente’] }
} } )
Más funciones
Hay muchas más funciones básicas:
• Agrupación• Distintc• Contadores• FindAndModify• …
¿Tercera forma normal?
Modelos de Datos
• Embebidos• Aprovecha las capacidades de los
subdocumentos para contener la relación dentro del propio documento.
• Normalizados• Referencia los documentos mediante IDs.
Modelo Embebido
Modelo Normalizado
Cardinalidad en MongoDB
• Cardinalidades en MongoDB:• Modelo 1:1• Modelo 1:N• Modelo 1:N Referenciado• Modelos en Árbol
• Más información de modelos en http://docs.mongodb.org/manual/data-modeling/
{ _id: "joe",name: "Joe Bookreader",address: {
street: "123 Fake Street",city: "Faketon",state: "MA",zip: 12345
} }
Cardinalidad 1:1
{ _id: "joe",name: "Joe Bookreader",addresses: [
{street: "123 Fake Street",city: "Faketon",state: "MA",zip: 12345
}, {
street: "1 Some Other Street",city: "Boston",state: "MA",zip: 12345
}]
}
Cardinalidad 1:N
{_id: "oreilly",name: "O'Reilly Media",founded: 1980,location: "CA“
}{
_id: 123456789,title: "MongoDB: The Definitive Guide“,author: [ "Kristina Chodorow", "Mike Dirolf" ],published_date: ISODate("2010-09-24"),pages: 216, language: "English",publisher_id: "oreilly“
}
Cardinalidad 1:N Referenciada
Quiero hacer un join
• MongoDB no soporta JOINS
• La manipulación de información referenciada hay que hacerla manual.
• Algunos drivers han implementado un objeto DBRefs para poder ayudar en la consulta de información referenciada.
A tener en cuenta cuando modelas
• El crecimiento de los documentos• Si añadimos nuevos elementos/campos al
documento y nos pasamos del tamaño máximo MongoDB tendrá que alojar el documento en disco.
• Atomicidad de las operaciones• En MongoDB la atomicidad es a nivel de
documento.• Manejo de Índices
• Para mejorar el rendimiento. Por defecto hay un índice sobre el _id.
• Distribución de los documentos• El escalado en MongoDB es horizontal utilizando
una «sharded key»
Rendimiento… Indexame.
¿Cómo establecer un índice?
• MongoDB nos proporciona la función ensureIndex para establecer un índice.
db.ciudades.ensureIndex( { “ciudad" : 1 } )
• Podemos crear índices en subdocumentos
db.people.ensureIndex({“direccion.codigopostal": 1
} )
Realizando un Explain
• Se puede ver el plan de ejecución de una consulta con explain
db.collection.find().explain()
Resultado de un Explain
{"cursor" : "BasicCursor","isMultiKey" : false,"n" : 14,"nscannedObjects" : 14,"nscanned" : 14,"nscannedObjectsAllPlans" : 14,"nscannedAllPlans" : 14,"scanAndOrder" : false,"indexOnly" : false,"nYields" : 0,"nChunkSkips" : 0,"millis" : 0,"indexBounds" : {}}
Agregar datos en MongoDB.
¿Qué es el Aggregation Framework?
• Son un conjunto de operaciones que nos permiten procesar conjuntos completos de resultados.
• Evita que tengamos que desarrollar código de aplicación para realizar ciertas tareas.
Pipeline del Aggregation Framework
• El Aggregation Framework se apoya en un pipeline de operaciones que se van ejecutando de manera consecutiva
• Las operaciones que podemos ejecutar en un pipeline son:• Filtros• Transformaciones• Agrupaciones• Ordenaciones
Secuencia del Pipeline
SQL Terms, Functions, and Concepts MongoDB Aggregation Operators
WHERE $match
GROUP BY $group
HAVING $match
SELECT $project
ORDER BY $sort
LIMIT $limit
SUM() $sum
COUNT() $sum
join
No direct corresponding operator; however, the $unwind operator allows for somewhat similar functionality, but with fields embedded within the document.
SQL versus Aggregation Framework
Java, Python, Javascript,..
Lenguajes de Programación con MongoDB
• MongoDB ofrece drivers para la integración con múltiples lenguajes:• Java• Python• PHP• C/C++• Ruby• Scala• ….
Shell MongoDB
• El manejo básico que podemos hacer es mediante el Shell MongoDB
• El Shell MongoDB es un shell Javascript que nos permite ejecutar las operaciones básicas
• Para ejecutarlo
mongo nombreprograma.js
Programa con Shell
conn= new Mongo();db = conn.getDB("demografia");
printjson(db.ciudades.findOne());
cursor = db.ciudades.find({$or:[{ciudad:/^M/},{ciudad:/^Z/}]
});
while (cursor.hasNext()){printjson(cursor.next());}
import com.mongodb.*;
MongoClient mongoClient =new MongoClient( "localhost" );
DBCollection coll = db.getCollection("testCollection");
BasicDBObject doc = new BasicDBObject("name", "MongoDB“)
. append("type", "database")
. append("count", 1)
. append("info", new BasicDBObject("x", 203).append("y", 102));
coll.insert(doc);
MongoDB y Java
import com.mongodb.*;
MongoClient mongoClient =new MongoClient( "localhost" );
DBCollection coll =db.getCollection("testCollection");
BasicDBObject query = new BasicDBObject("i", 71);
cursor = coll.find(query);
try {while(cursor.hasNext()) {
System.out.println(cursor.next()); }} finally { cursor.close(); }
Cursores en Java
import pymongo
client = MongoClient()db = client.demografiacollection = db.ciudades
ciudad = {‘ciudad’:’Avila’,habitantes:58570
}
ciudades.insert(ciudad)
MongoDB, Python y Pymongo
Más, más, más,...
MongoDB y GridFS
• GridFS• Manejo de documentos que excedan el
límite de 16GB establecido por BSON.• GridFS permite partir el documento en
diferentes partes.
MongoDB y Map Reduce
Proporciona la alta disponibilidad y redundancia de datos.
MongoDB y Replicación
• Escalado Horizontal: Capacidad de distribuir datos en diferentes máquinas
• Utiliza la sharding key para distribuir los datos.
MongoDB y Sharding
Herramientas
Herramientas en MongoDB
• MongoBird• Administrador y Consola en tiempo real• http://mongobird.citsoft.net/
• MongoVision• Herramienta de Administración
http://code.google.com/p/mongo-vision/• MongoHub
• Herramienta nativa para MacOS• https://github.com/fotonauts/MongoHub-Mac
• ¿Cómo administras MongoDB?http://codemotion.es/talk/18-october/122
• Plugin para Elipse que permite administrar MongoDB
• https://marketplace.eclipse.org/content/monjadb
MonjaDB
Quiero aprender más
Enlaces MongoDB
• Documentación de MongoDB• http://docs.mongodb.org/manual/
• API MongoDB• http://api.mongodb.org
• MongoDB en Facebook• https://www.facebook.com/mongodb
• MongoDB en Twitter• http://twitter.com/#!/MongoDB
• Grupos en Google• https://groups.google.com/group/mongodb-user
Enlaces MongoDB en Español
• MongoDB Meetup• http://www.meetup.com/Madrid-MongoDB-User-G
roup/• MongoDB en Español Facebook
• https://www.facebook.com/groups/mongodb.es/• Mis artículos sobre MongoDB
• http://lineadecodigo.com/categoria/mongodb
No os preocupéis por los enlaces…@victor_cuervo