nosql: primeros pasos en mongodb

76
NOSQL: Primeros Pasos con MongoDB

Upload: victorcuervo

Post on 13-Jun-2015

3.176 views

Category:

Technology


2 download

DESCRIPTION

Presentación sobre MongoDB para CodeMotion 2013

TRANSCRIPT

Page 1: NOSQL: Primeros Pasos en MongoDB

NOSQL: Primeros Pasos con MongoDB

Page 2: NOSQL: Primeros Pasos en 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

Page 3: NOSQL: Primeros Pasos en MongoDB

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

Page 4: NOSQL: Primeros Pasos en MongoDB

¿Qué es eso del NOSQL?

Page 5: NOSQL: Primeros Pasos en MongoDB

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?

Page 6: NOSQL: Primeros Pasos en MongoDB

¿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

Page 7: NOSQL: Primeros Pasos en MongoDB

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

Page 8: NOSQL: Primeros Pasos en MongoDB

Quiero usar NOSQL… dame ejemplos

• Ejemplo Básico…• Información de redes sociales• Logs

• … y en la industria• Polimorfismo de datos

Page 9: NOSQL: Primeros Pasos en MongoDB

¿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

Page 10: NOSQL: Primeros Pasos en MongoDB

Hablemos de MongoDB

Page 11: NOSQL: Primeros Pasos en 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

Page 12: NOSQL: Primeros Pasos en MongoDB

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/

Page 13: NOSQL: Primeros Pasos en MongoDB

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

}]}

Page 14: NOSQL: Primeros Pasos en MongoDB

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/

Page 15: NOSQL: Primeros Pasos en MongoDB

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.

Page 16: NOSQL: Primeros Pasos en MongoDB

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

Page 17: NOSQL: Primeros Pasos en MongoDB

Pero haz ya una SELECT

Page 18: NOSQL: Primeros Pasos en MongoDB

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

}

Page 19: NOSQL: Primeros Pasos en MongoDB

Consultas, función find

Las consultas se ejecutan mediante la función find:

db.ciudades.find({ciudad:'Madrid'});

Page 20: NOSQL: Primeros Pasos en MongoDB

Consultas con operadores

Podemos utilizar operadores dentro de las consultas:

db.ciudades.find({habitantes:{$lt:400000}

});

db.ciudades.find({habitantes:{$gt:1000000}

});

Page 21: NOSQL: Primeros Pasos en MongoDB

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/}]

});

Page 22: NOSQL: Primeros Pasos en MongoDB

Sort para ordenar resultados

Ascendente (1) o descendente (-1)

db.ciudades.find().sort({ciudad:1

});db.ciudades.find().sort({

ciudad:-1});

Page 23: NOSQL: Primeros Pasos en MongoDB

Limit para limitar las consultas

Recibe el número de elementos a limitar en la consulta como parámetro.

db.ciudades.find().limit(4);

Page 24: NOSQL: Primeros Pasos en MongoDB

IN para consulta de elementos

Los elementos de los valores están en un array:

db.ciudades.find({ciudad:{$in:

['Avila','Zamora','Madrid']}});

Page 25: NOSQL: Primeros Pasos en MongoDB

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$/});

Page 26: NOSQL: Primeros Pasos en MongoDB

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});

Page 27: NOSQL: Primeros Pasos en MongoDB

Saltarnos datos con SKIP

Recibe como parámetro los elementos a saltar:

db.ciudades.find().skip(2);

Page 28: NOSQL: Primeros Pasos en MongoDB

Insertar datos

Utilizamos la función Insert

db.ciudades.insert({'ciudad':'Avila','habitantes':58915

});

Page 29: NOSQL: Primeros Pasos en MongoDB

Actualizar datos

Utilizamos la función Update:

db.ciudades.update({ciudad:'Avila'},{$set:{habitantes:58915}

});

Page 30: NOSQL: Primeros Pasos en MongoDB

Actualizaciones Múltiples

Por defecto MongoDB solo actualiza un documento:

db.ciudades.update({habitantes:{$gt:600000}},{$set:{'grande':true}},{multi:true}

);

Page 31: NOSQL: Primeros Pasos en MongoDB

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}

);

Page 32: NOSQL: Primeros Pasos en MongoDB

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);

Page 33: NOSQL: Primeros Pasos en MongoDB

Dot Notation

MongoDB utiliza la anotación del punto para acceder a campos de subdocumentos y a elementos de arrays:

array.indice

subdocumento.campo

Page 34: NOSQL: Primeros Pasos en MongoDB

$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’] }

} } )

Page 35: NOSQL: Primeros Pasos en MongoDB

Más funciones

Hay muchas más funciones básicas:

• Agrupación• Distintc• Contadores• FindAndModify• …

Page 36: NOSQL: Primeros Pasos en MongoDB

¿Tercera forma normal?

Page 37: NOSQL: Primeros Pasos en MongoDB

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.

Page 38: NOSQL: Primeros Pasos en MongoDB

Modelo Embebido

Page 39: NOSQL: Primeros Pasos en MongoDB

Modelo Normalizado

Page 40: NOSQL: Primeros Pasos en MongoDB

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/

Page 41: NOSQL: Primeros Pasos en MongoDB

{ _id: "joe",name: "Joe Bookreader",address: {

street: "123 Fake Street",city: "Faketon",state: "MA",zip: 12345

} }

Cardinalidad 1:1

Page 42: NOSQL: Primeros Pasos en MongoDB

{ _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

Page 43: NOSQL: Primeros Pasos en MongoDB

{_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

Page 44: NOSQL: Primeros Pasos en MongoDB

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.

Page 45: NOSQL: Primeros Pasos en MongoDB

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»

Page 46: NOSQL: Primeros Pasos en MongoDB

Rendimiento… Indexame.

Page 47: NOSQL: Primeros Pasos en MongoDB

¿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

} )

Page 48: NOSQL: Primeros Pasos en MongoDB

Realizando un Explain

• Se puede ver el plan de ejecución de una consulta con explain

db.collection.find().explain()

Page 49: NOSQL: Primeros Pasos en MongoDB

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" : {}}

Page 50: NOSQL: Primeros Pasos en MongoDB

Agregar datos en MongoDB.

Page 51: NOSQL: Primeros Pasos 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.

Page 52: NOSQL: Primeros Pasos en MongoDB

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

Page 53: NOSQL: Primeros Pasos en MongoDB

Secuencia del Pipeline

Page 55: NOSQL: Primeros Pasos en MongoDB

Java, Python, Javascript,..

Page 56: NOSQL: Primeros Pasos en MongoDB

Lenguajes de Programación con MongoDB

• MongoDB ofrece drivers para la integración con múltiples lenguajes:• Java• Python• PHP• C/C++• Ruby• Scala• ….

Page 57: NOSQL: Primeros Pasos en MongoDB

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

Page 58: NOSQL: Primeros Pasos en MongoDB

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());}

Page 59: NOSQL: Primeros Pasos en MongoDB

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

Page 60: NOSQL: Primeros Pasos en MongoDB

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

Page 61: NOSQL: Primeros Pasos en MongoDB

import pymongo

client = MongoClient()db = client.demografiacollection = db.ciudades

ciudad = {‘ciudad’:’Avila’,habitantes:58570

}

ciudades.insert(ciudad)

MongoDB, Python y Pymongo

Page 62: NOSQL: Primeros Pasos en MongoDB

Más, más, más,...

Page 63: NOSQL: Primeros Pasos en MongoDB

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.

Page 64: NOSQL: Primeros Pasos en MongoDB

MongoDB y Map Reduce

Page 65: NOSQL: Primeros Pasos en MongoDB

Proporciona la alta disponibilidad y redundancia de datos.

MongoDB y Replicación

Page 66: NOSQL: Primeros Pasos en MongoDB

• Escalado Horizontal: Capacidad de distribuir datos en diferentes máquinas

• Utiliza la sharding key para distribuir los datos.

MongoDB y Sharding

Page 67: NOSQL: Primeros Pasos en MongoDB

Herramientas

Page 68: NOSQL: Primeros Pasos en MongoDB

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

Page 69: NOSQL: Primeros Pasos en MongoDB

• Plugin para Elipse que permite administrar MongoDB

• https://marketplace.eclipse.org/content/monjadb

MonjaDB

Page 70: NOSQL: Primeros Pasos en MongoDB

Quiero aprender más

Page 71: NOSQL: Primeros Pasos en MongoDB

• https://education.mongodb.com

MongoDB University

Page 72: NOSQL: Primeros Pasos en MongoDB

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

Page 73: NOSQL: Primeros Pasos en MongoDB

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

Page 74: NOSQL: Primeros Pasos en MongoDB

No os preocupéis por los enlaces…@victor_cuervo

Page 75: NOSQL: Primeros Pasos en MongoDB
Page 76: NOSQL: Primeros Pasos en MongoDB