2. Índice de Contenidos
•
•
•
•
•
•
•
•
•
•
•
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
3. Sobre el ponente: Víctor Cuervo
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.com
http://www.victorcuervo.com
Responsable del Área QA
Arquitecto Técnico
ISBAN. Grupo Santander
5. ¿Qué es 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.
6. ¿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
7. 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
8. Quiero usar NOSQL… dame ejemplos
• Ejemplo Básico…
•
•
Información de redes sociales
Logs
• … y en la industria
• Polimorfismo de datos
11. ¿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
12. 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
14. 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/
15. Ejecutar MongoDB
mongod
Nos permite arrancar el servidor de MongoDB
Escucha en el puerto 27017
mongo
Ejecuta la consola de MongoDB
En http://www.mongodb.org/downloads se puede
encontrar una consola de pruebas.
16. Conceptos Básicos
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 key
Specify any unique column or column
combination as primary key.
primary key
In MongoDB, the primary key is
automatically set to the _id field.
aggregation (e.g. group by)
aggregation pipeline
See the SQL to Aggregation Mapping
Chart.
19. Consultas, función find
Las consultas se ejecutan mediante la función
find:
db.ciudades.find({ciudad:'Madrid'});
20. Consultas con operadores
Podemos utilizar operadores dentro de las
consultas:
db.ciudades.find({
habitantes:{$lt:400000}
});
db.ciudades.find({
habitantes:{$gt:1000000}
});
21. 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/}]
});
22. Sort para ordenar resultados
Ascendente (1) o descendente (-1)
db.ciudades.find().sort({
ciudad:1
});
db.ciudades.find().sort({
ciudad:-1
});
23. Limit para limitar las consultas
Recibe el número de elementos a limitar en la
consulta como parámetro.
db.ciudades.find().limit(4);
24. IN para consulta de elementos
Los elementos de los valores están en un array:
db.ciudades.find({ciudad:
{$in:['Avila','Zamora','Madrid']}
});
25. 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$/});
26. 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});
27. Saltarnos datos con SKIP
Recibe como parámetro los elementos a saltar:
db.ciudades.find().skip(2);
30. Actualizaciones Múltiples
Por defecto MongoDB solo actualiza un
documento:
db.ciudades.update({
habitantes:{$gt:600000}},
{$set:{'grande':true}},
{multi:true}
);
31. 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}
);
32. 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);
33. Dot Notation
MongoDB utiliza la anotación del punto para
acceder a campos de subdocumentos y a
elementos de arrays:
array.indice
subdocumento.campo
34. $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’]
}
}})
35. Más funciones
Hay muchas más funciones básicas:
•
•
•
•
•
Agrupación
Distintc
Contadores
FindAndModify
…
37. 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.
40. 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/datamodeling/
44. 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.
45. 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»
51. ¿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.
52. 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
54. SQL versus Aggregation Framework
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.
56. Lenguajes de Programación con MongoDB
• MongoDB ofrece drivers para la integración con
múltiples lenguajes:
• Java
• Python
• PHP
• C/C++
• Ruby
• Scala
• ….
57. 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
58. 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());
}
59. MongoDB y Java
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);
63. 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.
66. MongoDB y Sharding
• Escalado Horizontal: Capacidad de distribuir
datos en diferentes máquinas
• Utiliza la sharding key para distribuir los datos.
72. 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
73. Enlaces MongoDB en Español
• MongoDB Meetup
•
http://www.meetup.com/Madrid-MongoDB-UserGroup/
• MongoDB en Español Facebook
•
https://www.facebook.com/groups/mongodb.es/
• Mis artículos sobre MongoDB
•
http://lineadecodigo.com/categoria/mongodb