SlideShare una empresa de Scribd logo
1 de 71
MongoDB Avanzado
Víctor CuervoMADRID · NOV 27-28 · 2015
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
$db.getuser(“victorcuervo”)
{
name: “Víctor Cuervo”,
profession: “IT Architect. Santander Group”,
socialinfo: {
twitter:“@victor_cuervo”,
website:“http://lineadecodigo.com”,
linkedin:“https://es.linkedin.com/in/victorcuervo”,
email:“vcuervo@gmail.com”
},
hobbies: [“winetasting”,”programming”],
programming_languages: [“java”,”mongodb”,”javascript”,”python”]
}
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Recursos de la presentación
http://twitter.com/victor_cuervo
https://github.com/victorcuervo/mongodb-codemotion
http://www.slideshare.net/victorcuervo/
Menos “likes”. Más cervezas.
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Índice
MongoDB
Nuevo en MongoDB 3.2
Consultas Avanzadas
Índices Avanzados
Modelado en MongoDB
DBaaS y PaaS
Tooling con MongoDB
{twitter:”@victor_cuervo”}
Una base de datos
NOSQL llamada
MongoDB
¿Todavía no sabes qué es
MongoDB?
10 comandos sobre MongoDB
Gartner
1
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
¿Todavía no sabes qué es MongoDB?
Base de datos NOSQL orientada a documentos (BSON-
JSON).
Trabajo con modelos de datos flexibles
Proporciona alto rendimiento y alta escalabilidad.
Ofrece múltiples APIs sobre diferentes lenguajes de
programación: java, python, shell, nodejs, go,…
Maneja bases de datos, colecciones, campos, indices,…y no
permite hacer un xxxxxx join.
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
10 comandos MongoDB
db.ciudades.find({ciudad:”Madrid”})
db.ciudades.find({habitantes:{$lt:60000})
db.ciudades.find().sort({ciudad:1}).limit(10)
db.ciudades.find({ciudad: {$in:[“Avila”,”Madrid”]}})
db.ciudades.insert({“ciudad”:”Avila”,”habitantes”:58915})
db.ciudades.update({“ciudad”:”Avila”},{$set:{habitantes:58915}})
db.ciudades.update({“ciudad”:”Avila”},{$set:{habitantes:58915}},{upsert:true})
db.ciudades.delete({ciudad:”Zamora”})
db.ciudades.update({ciudad:”Avila”, {$push : {monumentos: {$each: [“Murallas”, “San Vicente”,
“La Santa”]}}})
db.ciudades.createIndex({ciudad:”1”})
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Cuadrante Mágico Gartner
Cuadrante sobre bases
de datos operacionales.
MongoDB dentro del
cuadrante de challengers.
(*) https://www.mongodb.com/blog/post/gartner-positions-
mongodb-challenger-magic-quadrant-operational-database-
management
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Si te has quedado con dudas…
Manual MongoDB
https://docs.mongodb.org/manual/
NOSQL: Primeros pasos en MongoDB
http://www.slideshare.net/victorcuervo/nosql-primeros-pasos-en-mongodb-codemotion
Ejemplos de código en MongoDB
http://lineadecodigo.com/categoria/mongodb/
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Antes de empezar… Colección Ejemplo
{
"_id" : ObjectId("565914732c23d80f730a1f49"),
"gender" : "M",
"name" : "Dennis Rogers",
"username" : "drogers1",
"birthday" : "06/11/1957",
"email" : "drogers1@issuu.com",
"social" : {
"facebook" : "drogers1",
"twitter" : "drogers1",
"linkedin" : "drogers1"
},
"description" : "Proin interdum mauris non ligula….”,
"hobbies" : [
"tv",
"cine",
"viajes"
]
}
{twitter:”@victor_cuervo”}
Novedades sobre
MongoDB 3.2
Nuevos engines
Validación de documentos
MongoDB y RealTime
MongoDB Compass
API de Métricas
2
Todo el detalle de MongoDB 3.2 en https://www.mongodb.com/mongodb-3.2?jmp=docs
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Nuevos Engines
Se añaden nuevos engines de almacenamiento.
Las capacidades de la plataforma se pueden extender
atendiendo al tipo de carga que tengamos para cada
escenario:
Almacenamiento en memoria para real-time
Almacenamiento de datos securizados
Uso de WiredTiger como engine por defecto.
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Nuevos Engines: Escenarios
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Validación de documentos
En MongoDB 3.2 se puede
personalizar si queremos forzar
la validación del documento:
estructura, tipos de datos,
rangos,..
Ayuda al gobierno de los
schemas y datos almacenados.
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Validación de documentos
db.runCommand({
collMod: "contacts",
validator: {
$and: [
{year_of_birth: {$lte: 1994}},
{$or: [
{phone: { $type: "string" }},
{email: { $type: "string" }}
]}]
}})
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
MongoDB y Real Time
El BI Connector permite integrar MongoDB con
herramientas de visualización como Tableau, QlikView,…
“El 90% de los datos nunca son analizados y el
60% de los datos pierde el valor milisegundos
después de ser generado”
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
MongoDB Compass
MongoDB Compass
es un GUI que permite
explorar los datos de
forma visual sin tirar
una consulta.
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
API de Métricas
MongoDB 3.2 ofrece un API que expone las métricas de
rendimiento de las queries para que puedan ser
consumidas por herramientas APM (Application
Performance Monitoring).
{twitter:”@victor_cuervo”}
Consultas Avanzadas
en MongoDB
Covered Queries
Text Search
Expresiones Regulares
Bulking
Capped Collection
Two Phase Commit
3
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Covered Queries
Las covered queries son aquellas que:
• todos los campos de la query son parte del índice y
• todos los campos devueltos por una query están en el mismo
índice
La búsqueda de MongoDB solo se realizará por el índice y no a través
de los documentos. Como los índices están en memoria, la
recuperación de información es muy rápida.
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Ejemplo de Covered Query
{
"_id": ObjectId("53402597d852426020000002"),
"birthday": “11/18/1977”,
"gender": "M",
"name": “Víctor Cuervo",
"username": “victorcuervo"
}
# Índice
db.users.createIndex({gender:1,username:1})
#Consulta
db.users.find({gender:"M"},{username:1,_id:0})
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Text Search
MongoDB soporta índices sobre elementos de texto. De esa manera podemos
realizar búsquedas de cadenas de texto.
Para poder utilizar Text Search en MongoDB deberemos de:
• Activar las búsquedas de texto mediante el parámetro
searchTextEnabled.
• Crear un índice de texto
• Realizar la consulta.
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Ejemplo de Text Search
db.adminCommand({setParameter:true,textSearchEnabled:true})
{
"_id": ObjectId("53402597d852426020000002"),
"username": “raulanton”,
“description”: “Apasionado de la lectura de novelas históricas…”,
“hobbies”: [“lectura”,”novelas”,”cine”,”naturaleza”]
}
db.posts.createIndex({description:"text"})
db.posts.createIndex({description:"text"}, {default_language:spanish})
db.posts.find({$text:{$search:"novelas"}})
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Ejemplo de Text Search
#Consulta de texto
db.posts.find({$text:{$search:”novelas”}})
# Más nos vale tener el índice
Error: error: {
"waitedMS" : NumberLong(0),
"ok" : 0,
"errmsg" : "text index required for $text query",
"code" : 27
}
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Expresiones Regulares
Podemos realizar búsquedas por patrones mediante expresiones regulares.
MongoDB nos proporciona el operador $regexp
Se pueden indicar parámetro de las búsquedas, por ejemplo si queremos que
sean “case sensitive”.
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Ejemplo de Expresiones Regulares
{
"_id": ObjectId("53402597d852426020000002"),
"username": “raulanton”,
“name”: “Raúl Antón”,
“description”: “Apasionado de la lectura de novelas históricas…”,
“hobbies”: [“lectura”,”novelas”,”cine”,”naturaleza”]
}
db.posts.find({name:{$regex:”Ra”}})
db.posts.find({name:/^R/})
db.posts.find({contenido:{$regex:”ra",$options:"$i"}})
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Bulking
MongoDB permite ejecutar operaciones en batch. De
esta manera nos devuelve un documento resultado de la
ejecución de todas las operaciones.
De forma ordenada o desordenada:
initializeOrderedBulkOp()
initializeUnOrderedBulkOp()
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Ejemplo de bulking
bulk = db.products.initializeOrderedBulkOp()
bulk.insert({name:"A",items:10})
bulk.insert({name:"B",items:15})
bulk.find({name:"A"}).update({ $inc: { items : 1 }})
bulk.find({name:"B"}).removeOne()
bulk.execute()
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Capped Collection
Son colecciones de tamaño fijo que soportan un alto
throughput de operaciones. Mantienen el orden de
inserción, por lo cual no necesitan un índice.
Funcionan como un buffer circular, de tal manera que
cuando se llena se eliminan los documentos más antiguos.
MADRID · NOV 27-28 · 2015
Ejemplo de Capped Collection
# Crear una Capped Collection
db.createCollection( "log", { capped: true, size: 100000 } )
# Validar si es una Capped Collection
db.log.isCapped()
#Recuperar los documento en orden inverso
db.log.find().sort( { $natural: -1 } )
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Two Phase Commit
Las operaciones en MongoDB son atómicas sobre un solo
documento. La capacidad de tener documentos anidados junto
con la atomicidad sería un enfoque para los antiguos modelos
“two phase commit”.
En el caso de que haya que tratar varios documentos de forma
transaccional hay que implementar dicha transaccionalidad en la
aplicación.
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Two Phase Commit Pattern
Consideramos el escenario en el que vamos a transferir
desde la cuenta A a la cuenta B una cantidad de
dinero.
Partimos de dos colecciones:
cuentas - accounts
transacciones - transacctions
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Two Phase Commit Pattern
1. Inicializamos las cuentas
db.accounts.insert(
[
{ _id: "A", balance: 1000, pendingTransactions: [] },
{ _id: "B", balance: 1000, pendingTransactions: [] }
]
)
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Two Phase Commit Pattern
2. Creamos una transacción
db.transactions.insert(
{ _id: 1,
source: “A",
destination: “B",
value: 100,
state: “initial",
lastModified: new Date()
})
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Two Phase Commit Pattern
3. Buscamos una transacción para ejecutar
var t = db.transactions.findOne( { state: "initial" } )
db.transactions.update(
{ _id: t._id, state: "initial" },
{
$set: { state: "pending" },
$currentDate: { lastModified: true }
}
)
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Two Phase Commit Pattern
4. Movimiento en cuenta y transacciones Pendientes
db.accounts.update(
{ _id: t.source, pendingTransactions: { $ne: t._id } },
{ $inc: { balance: -t.value }, $push: { pendingTransactions: t._id } }
)
db.accounts.update(
{ _id: t.destination, pendingTransactions: { $ne: t._id } },
{ $inc: { balance: t.value }, $push: { pendingTransactions: t._id } }
)
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Two Phase Commit Pattern
5. Transacciones Aplicadas
db.transactions.update(
{ _id: t._id, state: "pending" },
{
$set: { state: "applied" },
$currentDate: { lastModified: true }
}
)
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Two Phase Commit Pattern
6. Eliminamos las pendientes de las cuentas
db.accounts.update(
{ _id: t.source, pendingTransactions: t._id },
{ $pull: { pendingTransactions: t._id } }
)
db.accounts.update(
{ _id: t.destination, pendingTransactions: t._id },
{ $pull: { pendingTransactions: t._id } }
)
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Two Phase Commit Pattern
7. Transacción ejecutada
db.transactions.update(
{ _id: t._id, state: "applied" },
{
$set: { state: "done" },
$currentDate: { lastModified: true }
}
)
Y luego me dices que el Cobol no mola…
{twitter:”@victor_cuervo”}
Índices Avanzados en
MongoDB
Índices multiclave
Índices sobre textos
Índices TTL
4
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Índices Multiclave
Son los índices que se aplican cuando el campo es un array. Se
crea una clave de índice por cada uno de los elementos que
componen el array.
No se pueden crear índices multiclave compuestos y tampoco se
puede especificar un índice multiclave como sharing key.
db.coll.createIndex( { <field>: < 1 or -1 > } )
MADRID · NOV 27-28 · 2015
Índices sobre textos
MongoDB cuenta con soporte para índices de texto para
facilitar búsquedas de contenido. Soporta “stopwords” para
ciertos idiomas.
db.users.createIndex( { description: "text" } )
# Para buscar por todos los campos
db.users.createIndex( { "$**": "text" } )
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Índices TTL
MongoDB permite que haya índices que tengan un tiempo
de vida. Pasado ese tiempo de vida, expiran.
db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
{twitter:”@victor_cuervo”}
Modelado en
MongoDB
One-To-One (1:1)
One-To-Many (1:N)
Many-To-Many (M:N)
5
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
One-To-One (1:1)
Las relaciones 1:1 pueden ser modeladas de dos formas
en MongoDB: insertar la relación en un único documento o
bien tener un link al otro documento.
{
name: “Víctor Cuervo",
age: 38
}
{
street: Alcala 45",
city: "Madrid"
}
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
One-To-One (1:1)
Embedding
{
name: “Víctor Cuervo",
age: 38,
address: {
street: “Alcala, 45",
city: "Madrid"
}
}
Linking
{
_id: 1,
name: “Víctor Cuervo",
age: 38
}
{
user_id: 1,
street: “Alcala, 45",
city: "Madrid"
}
MADRID · NOV 27-28 · 2015
One-To-Many (1:N)
Las relaciones 1:N pueden ser modeladas de tres formas
en MongoDB: insertar la relación en un único documento,
link al otro documento o bucketing.
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
One-To-Many (1:N)
{
title: “Línea de Código",
url: “http://lineadecodigo.com",
text: “Aprende a Programar"
}
{
blog_entry_id: 1,
name: “Daniel Hernandez",
created_on: ISODate("2014-01-01T10:01:22Z"),
comment: “Me gusta tu blog"
}
{
blog_entry_id: 1,
name: “Fran Honrrubia",
created_on: ISODate("2014-01-01T11:01:22Z"),
comment: “Gran trabajo"
}
Blog
Comentarios
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
One-To-Many (1:N). Embeding
{
title: “Línea de Código",
url: "http://lineadecodigo.com",
text: “Aprende a Programar",
comments: [{
name: “Daniel Hernandez",
created_on: ISODate("2014-01-01T10:01:22Z"),
comment: “Me gusta tu blog"
}, {
name: “Fran Honrubia",
created_on: ISODate("2014-01-01T11:01:22Z"),
comment: “Gran trabajo"
}]
}
El contenido insertado se crea
dentro de un array.
Hay que tener cuidado con el
tamaño del array y no sobrepasar
los 16Mb.
A MongoDB le cuesta calcular el
padding. Problemas de
performance.
MADRID · NOV 27-28 · 2015
One-To-Many (1:N). Linking
{
blog_entry_id: 1,
name: “Daniel Hernandez",
created_on: ISODate("2014-01-01T10:01:22Z"),
comment: “Me gusta tu blog"
}
{
blog_entry_id: 1,
name: “Fran Honrubia",
created_on: ISODate("2014-01-01T11:01:22Z"),
comment: “Gran trabajo"
}
Hay que hacer tantas lecturas a
la base de datos como
documentos tengamos
enlazados.
MADRID · NOV 27-28 · 2015
One-To-Many (1:N). Bucketing
{
blog_entry_id: 1,
page: 1,
count: 50,
comments: [{
name: “Daniel Hernandez",
created_on: ISODate("2014-01-01T10:01:22Z"),
comment: “Me gusta tu blog"
}, ...]
}
{
blog_entry_id: 1,
page: 2,
count: 1,
comments: [{
name: “Fran Honrubia",
created_on: ISODate("2014-01-01T11:01:22Z"),
comment: “Gran trabajo"
}]
}
Es una mezcla entre embedding y
linking. Se divide en contenedores
con un tamaño y se inserta el
comentario en el contenedor que
toca.
Tiene que tener algún concepto de
división como fechas,….
MADRID · NOV 27-28 · 2015
Many-To-Many (N:N)
Las relaciones N:N se modelan mediante técnicas de
embedding.
En el caso de que haya una de las partes predominantes
se modelaría hacía un solo sentido.
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Many-To-Many (N:N). Two Ways
{
_id: 1,
name: "Peter Standford",
books: [1, 2]
}
{
_id: 2,
name: "Georg Peterson",
books: [2]
}
{
_id: 1,
title: "A tale of two people",
categories: ["drama"],
authors: [1, 2]
}
{
_id: 2,
title: "A tale of two space ships",
categories: ["scifi"],
authors: [1]
}
MADRID · NOV 27-28 · 2015
Many-To-Many (N:N). One Way
{
_id: 1,
name: "drama"
}
{
_id: 1,
title: "A tale of two people",
categories: [1],
authors: [1, 2]
}
{twitter:”@victor_cuervo”}
DBaaS y PaaS:
MongoDB en Cloud
• MongoLab
• MongoDB y Docker
• MongoDB en PaaS
6
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
MongoLab
MongoLab es un BDaaS que nos permite
aprovisionarnos bases de datos de MongoDB de forma
dinámica en cloud de una forma sencilla.
Funciona en formato PaaS que funciona sobre Google,
AWS y Azure.
$ mongo ds047037.mongolab.com:47037/<db> -u <dbuser> -p <dbpassword>
$ mongodb://<dbuser>:<dbpassword>@ds047037.mongolab.com:47037/<db>
MADRID · NOV 27-28 · 2015
Características MongoLab
MongoLab nos permite de forma sencilla:
• Crear bases de datos dinámicamente.
• Monitorización y alertas 24x7.
• GUI para operaciones básicas.
• Análisis de índices y performance.
• Establecer seguridad en la conexión.
• Soporte para APIs de diferentes lenguajes.
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
MongoLab
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
MongoDB y Docker
MongoDB ya está “dockerizado”.
Disponible en el Docker Hub Registry (https://hub.docker.com/_/mongo/)
$ docker run --name some-mongo -d mongo
$ docker run -it --link some-mongo:mongo --rm mongo sh -c 'exec mongo
"$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"'
Crear una imagen Docker con MongoDB
https://docs.docker.com/engine/examples/mongodb/
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
MongoDB en PaaS
MongoDB está disponible en diferentes entornos
PaaS: BlueMix, Heroku, OpenShift,…
{twitter:”@victor_cuervo”}
Herramientas de
Tooling para
MongoDBMockaroo
Mongo Hacker
7
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Herramientas de tooling para MongoDB
Existen múltiples herramientas de tooling alrededor de
MongoDB: GUI, Conectores, Monitorización, Performance
Tuning, Mejoras del Shell, Manejo para JSON,…
Hay un listado extenso en http://mongodb-tools.com/
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Mockaroo
Herramienta online que nos permite crear colecciones JSON.
• Tipos de datos estándar: datos sobre personas, salud, monetarios,
colores,
• Permite crear subdocumentos y arrays
• Trabajar con expresiones regulares
• Dispone de un API para invocarlo de forma externa.
https://www.mockaroo.com
(*) Gratuito hasta 1.000 filas.
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Mockaroo
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Mongo Hacker
Permite mejorar el Shell de
MongoDB:
• Añadir colores
• Extensiones al API Shell
• Ayudas Framework
Agregación
https://tylerbrock.github.io/mongo
-hacker/
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Recursos
Nuevo en MongoDB 3.2
Capped collection
Nuevo API de Bulking
Two Phase Commit
Modeling MongoDB Schema
MongoLab
Mockaroo
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Recursos de la presentación
http://twitter.com/victor_cuervo
https://github.com/victorcuervo/mongodb-codemotion
http://www.slideshare.net/victorcuervo/
MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”}
Preguntas
MongoDB Avanzado

Más contenido relacionado

La actualidad más candente

Sistema gestor de base de datos( mongobd)
Sistema gestor de base de datos( mongobd)Sistema gestor de base de datos( mongobd)
Sistema gestor de base de datos( mongobd)
Shon AE
 

La actualidad más candente (20)

Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
Mongo DB
Mongo DB Mongo DB
Mongo DB
 
MongoDB
MongoDBMongoDB
MongoDB
 
Data modeling for Elasticsearch
Data modeling for ElasticsearchData modeling for Elasticsearch
Data modeling for Elasticsearch
 
MongoDB Sharding Fundamentals
MongoDB Sharding Fundamentals MongoDB Sharding Fundamentals
MongoDB Sharding Fundamentals
 
Sistema gestor de base de datos( mongobd)
Sistema gestor de base de datos( mongobd)Sistema gestor de base de datos( mongobd)
Sistema gestor de base de datos( mongobd)
 
A Technical Introduction to WiredTiger
A Technical Introduction to WiredTigerA Technical Introduction to WiredTiger
A Technical Introduction to WiredTiger
 
Node.js Express Tutorial | Node.js Tutorial For Beginners | Node.js + Expres...
Node.js Express Tutorial | Node.js Tutorial For Beginners | Node.js +  Expres...Node.js Express Tutorial | Node.js Tutorial For Beginners | Node.js +  Expres...
Node.js Express Tutorial | Node.js Tutorial For Beginners | Node.js + Expres...
 
Bootstrap 3
Bootstrap 3Bootstrap 3
Bootstrap 3
 
MySQL查询优化浅析
MySQL查询优化浅析MySQL查询优化浅析
MySQL查询优化浅析
 
JavaScript: Ajax & DOM Manipulation
JavaScript: Ajax & DOM ManipulationJavaScript: Ajax & DOM Manipulation
JavaScript: Ajax & DOM Manipulation
 
Oracle Endeca 101 Developer Introduction High Level Overview
Oracle Endeca 101 Developer Introduction High Level OverviewOracle Endeca 101 Developer Introduction High Level Overview
Oracle Endeca 101 Developer Introduction High Level Overview
 
MongoDB WiredTiger Internals
MongoDB WiredTiger InternalsMongoDB WiredTiger Internals
MongoDB WiredTiger Internals
 
Near Real-Time Netflix Recommendations Using Apache Spark Streaming with Nit...
 Near Real-Time Netflix Recommendations Using Apache Spark Streaming with Nit... Near Real-Time Netflix Recommendations Using Apache Spark Streaming with Nit...
Near Real-Time Netflix Recommendations Using Apache Spark Streaming with Nit...
 
Introduction to NodeJS
Introduction to NodeJSIntroduction to NodeJS
Introduction to NodeJS
 
Using MongoDB with the .Net Framework
Using MongoDB with the .Net FrameworkUsing MongoDB with the .Net Framework
Using MongoDB with the .Net Framework
 
The Basic Setup for OJS 2
The Basic Setup for OJS 2The Basic Setup for OJS 2
The Basic Setup for OJS 2
 
ATG Best Practices
ATG Best Practices ATG Best Practices
ATG Best Practices
 
Indexing
IndexingIndexing
Indexing
 
Mongodb basics and architecture
Mongodb basics and architectureMongodb basics and architecture
Mongodb basics and architecture
 

Destacado

Tema1 redhat
Tema1 redhatTema1 redhat
Tema1 redhat
mmartinv
 
Mongo db
Mongo dbMongo db
Mongo db
UPCI
 

Destacado (17)

Introducción a NoSQL con MongoDB
Introducción a NoSQL con MongoDBIntroducción a NoSQL con MongoDB
Introducción a NoSQL con MongoDB
 
NOSQL: Primeros Pasos en MongoDB
NOSQL: Primeros Pasos en MongoDBNOSQL: Primeros Pasos en MongoDB
NOSQL: Primeros Pasos en MongoDB
 
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4jBases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
 
Filtrado con grep y cut
Filtrado con grep y cutFiltrado con grep y cut
Filtrado con grep y cut
 
Tema1 redhat
Tema1 redhatTema1 redhat
Tema1 redhat
 
Introducción a NoSQL y MongoDB Webinar
Introducción a NoSQL y MongoDB WebinarIntroducción a NoSQL y MongoDB Webinar
Introducción a NoSQL y MongoDB Webinar
 
Mongo db
Mongo dbMongo db
Mongo db
 
1 tutorial de mongo db
1 tutorial de mongo db1 tutorial de mongo db
1 tutorial de mongo db
 
Shell exposición
Shell exposiciónShell exposición
Shell exposición
 
NoSql y MongoDB
NoSql y MongoDBNoSql y MongoDB
NoSql y MongoDB
 
Modificación de registros comando sed
Modificación de registros   comando sedModificación de registros   comando sed
Modificación de registros comando sed
 
COMANDOS SHELL Y PROGRAMACIÓN EN LA SHELL DEL BASH
COMANDOS SHELL Y PROGRAMACIÓN EN LA SHELL DEL BASHCOMANDOS SHELL Y PROGRAMACIÓN EN LA SHELL DEL BASH
COMANDOS SHELL Y PROGRAMACIÓN EN LA SHELL DEL BASH
 
Rutas absolutas y relativas
Rutas absolutas y relativasRutas absolutas y relativas
Rutas absolutas y relativas
 
Linux Programacion en Shell
Linux Programacion en ShellLinux Programacion en Shell
Linux Programacion en Shell
 
MongoDB: la BBDD NoSQL más popular del mercado
MongoDB: la BBDD NoSQL más popular del mercadoMongoDB: la BBDD NoSQL más popular del mercado
MongoDB: la BBDD NoSQL más popular del mercado
 
Graficos de control
Graficos de controlGraficos de control
Graficos de control
 
Hadoop, Pig, and Twitter (NoSQL East 2009)
Hadoop, Pig, and Twitter (NoSQL East 2009)Hadoop, Pig, and Twitter (NoSQL East 2009)
Hadoop, Pig, and Twitter (NoSQL East 2009)
 

Similar a MongoDB Avanzado

IntroduccióN A Sql Server 2005
IntroduccióN A Sql Server 2005IntroduccióN A Sql Server 2005
IntroduccióN A Sql Server 2005
oswchavez
 

Similar a MongoDB Avanzado (20)

Mi primera aplicación con MongoDB
Mi primera aplicación con MongoDBMi primera aplicación con MongoDB
Mi primera aplicación con MongoDB
 
Primeros pasos con aurelia
Primeros pasos con aureliaPrimeros pasos con aurelia
Primeros pasos con aurelia
 
CouchDB y el desarrollo de aplicaciones Android
CouchDB y el desarrollo de aplicaciones AndroidCouchDB y el desarrollo de aplicaciones Android
CouchDB y el desarrollo de aplicaciones Android
 
MongoDB y bluemix
MongoDB y bluemixMongoDB y bluemix
MongoDB y bluemix
 
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
 
Linq to sql 6
Linq to sql 6Linq to sql 6
Linq to sql 6
 
Análisis de Datos con MongoDB
Análisis de Datos con MongoDBAnálisis de Datos con MongoDB
Análisis de Datos con MongoDB
 
SSIS a fondo: monitorización y ajustes del servicio en producción - SolidQ Su...
SSIS a fondo: monitorización y ajustes del servicio en producción - SolidQ Su...SSIS a fondo: monitorización y ajustes del servicio en producción - SolidQ Su...
SSIS a fondo: monitorización y ajustes del servicio en producción - SolidQ Su...
 
No SQL MSATS MongoDB | SolidQ Summit 2014
No SQL MSATS MongoDB | SolidQ Summit 2014No SQL MSATS MongoDB | SolidQ Summit 2014
No SQL MSATS MongoDB | SolidQ Summit 2014
 
IntroduccióN A Sql Server 2005
IntroduccióN A Sql Server 2005IntroduccióN A Sql Server 2005
IntroduccióN A Sql Server 2005
 
Taller desarrollando sitios web multiplataforma
Taller desarrollando sitios web multiplataformaTaller desarrollando sitios web multiplataforma
Taller desarrollando sitios web multiplataforma
 
Adaptive BI Framework
Adaptive BI Framework Adaptive BI Framework
Adaptive BI Framework
 
10 cosas de rails que deberías saber
10 cosas de rails que deberías saber10 cosas de rails que deberías saber
10 cosas de rails que deberías saber
 
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
 
Dprn3 u3 a1_hehm
Dprn3 u3 a1_hehmDprn3 u3 a1_hehm
Dprn3 u3 a1_hehm
 
BigData - NoSQL
BigData -  NoSQL BigData -  NoSQL
BigData - NoSQL
 
Cuentas de Almacenamiento en Microsoft Azure con C#
Cuentas de Almacenamiento en Microsoft Azure con C#Cuentas de Almacenamiento en Microsoft Azure con C#
Cuentas de Almacenamiento en Microsoft Azure con C#
 
Capas de acceso a datos .net escalables de verdad contra SQL Server
Capas de acceso a datos .net escalables de verdad contra SQL ServerCapas de acceso a datos .net escalables de verdad contra SQL Server
Capas de acceso a datos .net escalables de verdad contra SQL Server
 
Revelando los secretos de twitter en México sg virtual
Revelando los secretos de twitter en México sg virtualRevelando los secretos de twitter en México sg virtual
Revelando los secretos de twitter en México sg virtual
 
Big Data, Revelando los secretos de twitter, CIMAT Zacatecas 2014
Big Data, Revelando los secretos de twitter, CIMAT Zacatecas 2014Big Data, Revelando los secretos de twitter, CIMAT Zacatecas 2014
Big Data, Revelando los secretos de twitter, CIMAT Zacatecas 2014
 

Último

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 

Último (11)

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 

MongoDB Avanzado

  • 2. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} $db.getuser(“victorcuervo”) { name: “Víctor Cuervo”, profession: “IT Architect. Santander Group”, socialinfo: { twitter:“@victor_cuervo”, website:“http://lineadecodigo.com”, linkedin:“https://es.linkedin.com/in/victorcuervo”, email:“vcuervo@gmail.com” }, hobbies: [“winetasting”,”programming”], programming_languages: [“java”,”mongodb”,”javascript”,”python”] }
  • 3. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Recursos de la presentación http://twitter.com/victor_cuervo https://github.com/victorcuervo/mongodb-codemotion http://www.slideshare.net/victorcuervo/
  • 5. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Índice MongoDB Nuevo en MongoDB 3.2 Consultas Avanzadas Índices Avanzados Modelado en MongoDB DBaaS y PaaS Tooling con MongoDB
  • 6. {twitter:”@victor_cuervo”} Una base de datos NOSQL llamada MongoDB ¿Todavía no sabes qué es MongoDB? 10 comandos sobre MongoDB Gartner 1
  • 7. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} ¿Todavía no sabes qué es MongoDB? Base de datos NOSQL orientada a documentos (BSON- JSON). Trabajo con modelos de datos flexibles Proporciona alto rendimiento y alta escalabilidad. Ofrece múltiples APIs sobre diferentes lenguajes de programación: java, python, shell, nodejs, go,… Maneja bases de datos, colecciones, campos, indices,…y no permite hacer un xxxxxx join.
  • 8. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} 10 comandos MongoDB db.ciudades.find({ciudad:”Madrid”}) db.ciudades.find({habitantes:{$lt:60000}) db.ciudades.find().sort({ciudad:1}).limit(10) db.ciudades.find({ciudad: {$in:[“Avila”,”Madrid”]}}) db.ciudades.insert({“ciudad”:”Avila”,”habitantes”:58915}) db.ciudades.update({“ciudad”:”Avila”},{$set:{habitantes:58915}}) db.ciudades.update({“ciudad”:”Avila”},{$set:{habitantes:58915}},{upsert:true}) db.ciudades.delete({ciudad:”Zamora”}) db.ciudades.update({ciudad:”Avila”, {$push : {monumentos: {$each: [“Murallas”, “San Vicente”, “La Santa”]}}}) db.ciudades.createIndex({ciudad:”1”})
  • 9. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Cuadrante Mágico Gartner Cuadrante sobre bases de datos operacionales. MongoDB dentro del cuadrante de challengers. (*) https://www.mongodb.com/blog/post/gartner-positions- mongodb-challenger-magic-quadrant-operational-database- management
  • 10. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Si te has quedado con dudas… Manual MongoDB https://docs.mongodb.org/manual/ NOSQL: Primeros pasos en MongoDB http://www.slideshare.net/victorcuervo/nosql-primeros-pasos-en-mongodb-codemotion Ejemplos de código en MongoDB http://lineadecodigo.com/categoria/mongodb/
  • 11. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Antes de empezar… Colección Ejemplo { "_id" : ObjectId("565914732c23d80f730a1f49"), "gender" : "M", "name" : "Dennis Rogers", "username" : "drogers1", "birthday" : "06/11/1957", "email" : "drogers1@issuu.com", "social" : { "facebook" : "drogers1", "twitter" : "drogers1", "linkedin" : "drogers1" }, "description" : "Proin interdum mauris non ligula….”, "hobbies" : [ "tv", "cine", "viajes" ] }
  • 12. {twitter:”@victor_cuervo”} Novedades sobre MongoDB 3.2 Nuevos engines Validación de documentos MongoDB y RealTime MongoDB Compass API de Métricas 2 Todo el detalle de MongoDB 3.2 en https://www.mongodb.com/mongodb-3.2?jmp=docs
  • 13. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Nuevos Engines Se añaden nuevos engines de almacenamiento. Las capacidades de la plataforma se pueden extender atendiendo al tipo de carga que tengamos para cada escenario: Almacenamiento en memoria para real-time Almacenamiento de datos securizados Uso de WiredTiger como engine por defecto.
  • 14. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Nuevos Engines: Escenarios
  • 15. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Validación de documentos En MongoDB 3.2 se puede personalizar si queremos forzar la validación del documento: estructura, tipos de datos, rangos,.. Ayuda al gobierno de los schemas y datos almacenados.
  • 16. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Validación de documentos db.runCommand({ collMod: "contacts", validator: { $and: [ {year_of_birth: {$lte: 1994}}, {$or: [ {phone: { $type: "string" }}, {email: { $type: "string" }} ]}] }})
  • 17. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} MongoDB y Real Time El BI Connector permite integrar MongoDB con herramientas de visualización como Tableau, QlikView,… “El 90% de los datos nunca son analizados y el 60% de los datos pierde el valor milisegundos después de ser generado”
  • 18. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} MongoDB Compass MongoDB Compass es un GUI que permite explorar los datos de forma visual sin tirar una consulta.
  • 19. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} API de Métricas MongoDB 3.2 ofrece un API que expone las métricas de rendimiento de las queries para que puedan ser consumidas por herramientas APM (Application Performance Monitoring).
  • 20. {twitter:”@victor_cuervo”} Consultas Avanzadas en MongoDB Covered Queries Text Search Expresiones Regulares Bulking Capped Collection Two Phase Commit 3
  • 21. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Covered Queries Las covered queries son aquellas que: • todos los campos de la query son parte del índice y • todos los campos devueltos por una query están en el mismo índice La búsqueda de MongoDB solo se realizará por el índice y no a través de los documentos. Como los índices están en memoria, la recuperación de información es muy rápida.
  • 22. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Ejemplo de Covered Query { "_id": ObjectId("53402597d852426020000002"), "birthday": “11/18/1977”, "gender": "M", "name": “Víctor Cuervo", "username": “victorcuervo" } # Índice db.users.createIndex({gender:1,username:1}) #Consulta db.users.find({gender:"M"},{username:1,_id:0})
  • 23. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Text Search MongoDB soporta índices sobre elementos de texto. De esa manera podemos realizar búsquedas de cadenas de texto. Para poder utilizar Text Search en MongoDB deberemos de: • Activar las búsquedas de texto mediante el parámetro searchTextEnabled. • Crear un índice de texto • Realizar la consulta.
  • 24. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Ejemplo de Text Search db.adminCommand({setParameter:true,textSearchEnabled:true}) { "_id": ObjectId("53402597d852426020000002"), "username": “raulanton”, “description”: “Apasionado de la lectura de novelas históricas…”, “hobbies”: [“lectura”,”novelas”,”cine”,”naturaleza”] } db.posts.createIndex({description:"text"}) db.posts.createIndex({description:"text"}, {default_language:spanish}) db.posts.find({$text:{$search:"novelas"}})
  • 25. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Ejemplo de Text Search #Consulta de texto db.posts.find({$text:{$search:”novelas”}}) # Más nos vale tener el índice Error: error: { "waitedMS" : NumberLong(0), "ok" : 0, "errmsg" : "text index required for $text query", "code" : 27 }
  • 26. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Expresiones Regulares Podemos realizar búsquedas por patrones mediante expresiones regulares. MongoDB nos proporciona el operador $regexp Se pueden indicar parámetro de las búsquedas, por ejemplo si queremos que sean “case sensitive”.
  • 27. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Ejemplo de Expresiones Regulares { "_id": ObjectId("53402597d852426020000002"), "username": “raulanton”, “name”: “Raúl Antón”, “description”: “Apasionado de la lectura de novelas históricas…”, “hobbies”: [“lectura”,”novelas”,”cine”,”naturaleza”] } db.posts.find({name:{$regex:”Ra”}}) db.posts.find({name:/^R/}) db.posts.find({contenido:{$regex:”ra",$options:"$i"}})
  • 28. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Bulking MongoDB permite ejecutar operaciones en batch. De esta manera nos devuelve un documento resultado de la ejecución de todas las operaciones. De forma ordenada o desordenada: initializeOrderedBulkOp() initializeUnOrderedBulkOp()
  • 29. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Ejemplo de bulking bulk = db.products.initializeOrderedBulkOp() bulk.insert({name:"A",items:10}) bulk.insert({name:"B",items:15}) bulk.find({name:"A"}).update({ $inc: { items : 1 }}) bulk.find({name:"B"}).removeOne() bulk.execute()
  • 30. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Capped Collection Son colecciones de tamaño fijo que soportan un alto throughput de operaciones. Mantienen el orden de inserción, por lo cual no necesitan un índice. Funcionan como un buffer circular, de tal manera que cuando se llena se eliminan los documentos más antiguos.
  • 31. MADRID · NOV 27-28 · 2015 Ejemplo de Capped Collection # Crear una Capped Collection db.createCollection( "log", { capped: true, size: 100000 } ) # Validar si es una Capped Collection db.log.isCapped() #Recuperar los documento en orden inverso db.log.find().sort( { $natural: -1 } )
  • 32. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Two Phase Commit Las operaciones en MongoDB son atómicas sobre un solo documento. La capacidad de tener documentos anidados junto con la atomicidad sería un enfoque para los antiguos modelos “two phase commit”. En el caso de que haya que tratar varios documentos de forma transaccional hay que implementar dicha transaccionalidad en la aplicación.
  • 33. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Two Phase Commit Pattern Consideramos el escenario en el que vamos a transferir desde la cuenta A a la cuenta B una cantidad de dinero. Partimos de dos colecciones: cuentas - accounts transacciones - transacctions
  • 34. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Two Phase Commit Pattern 1. Inicializamos las cuentas db.accounts.insert( [ { _id: "A", balance: 1000, pendingTransactions: [] }, { _id: "B", balance: 1000, pendingTransactions: [] } ] )
  • 35. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Two Phase Commit Pattern 2. Creamos una transacción db.transactions.insert( { _id: 1, source: “A", destination: “B", value: 100, state: “initial", lastModified: new Date() })
  • 36. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Two Phase Commit Pattern 3. Buscamos una transacción para ejecutar var t = db.transactions.findOne( { state: "initial" } ) db.transactions.update( { _id: t._id, state: "initial" }, { $set: { state: "pending" }, $currentDate: { lastModified: true } } )
  • 37. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Two Phase Commit Pattern 4. Movimiento en cuenta y transacciones Pendientes db.accounts.update( { _id: t.source, pendingTransactions: { $ne: t._id } }, { $inc: { balance: -t.value }, $push: { pendingTransactions: t._id } } ) db.accounts.update( { _id: t.destination, pendingTransactions: { $ne: t._id } }, { $inc: { balance: t.value }, $push: { pendingTransactions: t._id } } )
  • 38. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Two Phase Commit Pattern 5. Transacciones Aplicadas db.transactions.update( { _id: t._id, state: "pending" }, { $set: { state: "applied" }, $currentDate: { lastModified: true } } )
  • 39. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Two Phase Commit Pattern 6. Eliminamos las pendientes de las cuentas db.accounts.update( { _id: t.source, pendingTransactions: t._id }, { $pull: { pendingTransactions: t._id } } ) db.accounts.update( { _id: t.destination, pendingTransactions: t._id }, { $pull: { pendingTransactions: t._id } } )
  • 40. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Two Phase Commit Pattern 7. Transacción ejecutada db.transactions.update( { _id: t._id, state: "applied" }, { $set: { state: "done" }, $currentDate: { lastModified: true } } )
  • 41. Y luego me dices que el Cobol no mola…
  • 42. {twitter:”@victor_cuervo”} Índices Avanzados en MongoDB Índices multiclave Índices sobre textos Índices TTL 4
  • 43. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Índices Multiclave Son los índices que se aplican cuando el campo es un array. Se crea una clave de índice por cada uno de los elementos que componen el array. No se pueden crear índices multiclave compuestos y tampoco se puede especificar un índice multiclave como sharing key. db.coll.createIndex( { <field>: < 1 or -1 > } )
  • 44. MADRID · NOV 27-28 · 2015 Índices sobre textos MongoDB cuenta con soporte para índices de texto para facilitar búsquedas de contenido. Soporta “stopwords” para ciertos idiomas. db.users.createIndex( { description: "text" } ) # Para buscar por todos los campos db.users.createIndex( { "$**": "text" } )
  • 45. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Índices TTL MongoDB permite que haya índices que tengan un tiempo de vida. Pasado ese tiempo de vida, expiran. db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
  • 47. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} One-To-One (1:1) Las relaciones 1:1 pueden ser modeladas de dos formas en MongoDB: insertar la relación en un único documento o bien tener un link al otro documento. { name: “Víctor Cuervo", age: 38 } { street: Alcala 45", city: "Madrid" }
  • 48. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} One-To-One (1:1) Embedding { name: “Víctor Cuervo", age: 38, address: { street: “Alcala, 45", city: "Madrid" } } Linking { _id: 1, name: “Víctor Cuervo", age: 38 } { user_id: 1, street: “Alcala, 45", city: "Madrid" }
  • 49. MADRID · NOV 27-28 · 2015 One-To-Many (1:N) Las relaciones 1:N pueden ser modeladas de tres formas en MongoDB: insertar la relación en un único documento, link al otro documento o bucketing.
  • 50. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} One-To-Many (1:N) { title: “Línea de Código", url: “http://lineadecodigo.com", text: “Aprende a Programar" } { blog_entry_id: 1, name: “Daniel Hernandez", created_on: ISODate("2014-01-01T10:01:22Z"), comment: “Me gusta tu blog" } { blog_entry_id: 1, name: “Fran Honrrubia", created_on: ISODate("2014-01-01T11:01:22Z"), comment: “Gran trabajo" } Blog Comentarios
  • 51. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} One-To-Many (1:N). Embeding { title: “Línea de Código", url: "http://lineadecodigo.com", text: “Aprende a Programar", comments: [{ name: “Daniel Hernandez", created_on: ISODate("2014-01-01T10:01:22Z"), comment: “Me gusta tu blog" }, { name: “Fran Honrubia", created_on: ISODate("2014-01-01T11:01:22Z"), comment: “Gran trabajo" }] } El contenido insertado se crea dentro de un array. Hay que tener cuidado con el tamaño del array y no sobrepasar los 16Mb. A MongoDB le cuesta calcular el padding. Problemas de performance.
  • 52. MADRID · NOV 27-28 · 2015 One-To-Many (1:N). Linking { blog_entry_id: 1, name: “Daniel Hernandez", created_on: ISODate("2014-01-01T10:01:22Z"), comment: “Me gusta tu blog" } { blog_entry_id: 1, name: “Fran Honrubia", created_on: ISODate("2014-01-01T11:01:22Z"), comment: “Gran trabajo" } Hay que hacer tantas lecturas a la base de datos como documentos tengamos enlazados.
  • 53. MADRID · NOV 27-28 · 2015 One-To-Many (1:N). Bucketing { blog_entry_id: 1, page: 1, count: 50, comments: [{ name: “Daniel Hernandez", created_on: ISODate("2014-01-01T10:01:22Z"), comment: “Me gusta tu blog" }, ...] } { blog_entry_id: 1, page: 2, count: 1, comments: [{ name: “Fran Honrubia", created_on: ISODate("2014-01-01T11:01:22Z"), comment: “Gran trabajo" }] } Es una mezcla entre embedding y linking. Se divide en contenedores con un tamaño y se inserta el comentario en el contenedor que toca. Tiene que tener algún concepto de división como fechas,….
  • 54. MADRID · NOV 27-28 · 2015 Many-To-Many (N:N) Las relaciones N:N se modelan mediante técnicas de embedding. En el caso de que haya una de las partes predominantes se modelaría hacía un solo sentido.
  • 55. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Many-To-Many (N:N). Two Ways { _id: 1, name: "Peter Standford", books: [1, 2] } { _id: 2, name: "Georg Peterson", books: [2] } { _id: 1, title: "A tale of two people", categories: ["drama"], authors: [1, 2] } { _id: 2, title: "A tale of two space ships", categories: ["scifi"], authors: [1] }
  • 56. MADRID · NOV 27-28 · 2015 Many-To-Many (N:N). One Way { _id: 1, name: "drama" } { _id: 1, title: "A tale of two people", categories: [1], authors: [1, 2] }
  • 57. {twitter:”@victor_cuervo”} DBaaS y PaaS: MongoDB en Cloud • MongoLab • MongoDB y Docker • MongoDB en PaaS 6
  • 58. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} MongoLab MongoLab es un BDaaS que nos permite aprovisionarnos bases de datos de MongoDB de forma dinámica en cloud de una forma sencilla. Funciona en formato PaaS que funciona sobre Google, AWS y Azure. $ mongo ds047037.mongolab.com:47037/<db> -u <dbuser> -p <dbpassword> $ mongodb://<dbuser>:<dbpassword>@ds047037.mongolab.com:47037/<db>
  • 59. MADRID · NOV 27-28 · 2015 Características MongoLab MongoLab nos permite de forma sencilla: • Crear bases de datos dinámicamente. • Monitorización y alertas 24x7. • GUI para operaciones básicas. • Análisis de índices y performance. • Establecer seguridad en la conexión. • Soporte para APIs de diferentes lenguajes.
  • 60. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} MongoLab
  • 61. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} MongoDB y Docker MongoDB ya está “dockerizado”. Disponible en el Docker Hub Registry (https://hub.docker.com/_/mongo/) $ docker run --name some-mongo -d mongo $ docker run -it --link some-mongo:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"' Crear una imagen Docker con MongoDB https://docs.docker.com/engine/examples/mongodb/
  • 62. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} MongoDB en PaaS MongoDB está disponible en diferentes entornos PaaS: BlueMix, Heroku, OpenShift,…
  • 64. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Herramientas de tooling para MongoDB Existen múltiples herramientas de tooling alrededor de MongoDB: GUI, Conectores, Monitorización, Performance Tuning, Mejoras del Shell, Manejo para JSON,… Hay un listado extenso en http://mongodb-tools.com/
  • 65. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Mockaroo Herramienta online que nos permite crear colecciones JSON. • Tipos de datos estándar: datos sobre personas, salud, monetarios, colores, • Permite crear subdocumentos y arrays • Trabajar con expresiones regulares • Dispone de un API para invocarlo de forma externa. https://www.mockaroo.com (*) Gratuito hasta 1.000 filas.
  • 66. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Mockaroo
  • 67. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Mongo Hacker Permite mejorar el Shell de MongoDB: • Añadir colores • Extensiones al API Shell • Ayudas Framework Agregación https://tylerbrock.github.io/mongo -hacker/
  • 68. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Recursos Nuevo en MongoDB 3.2 Capped collection Nuevo API de Bulking Two Phase Commit Modeling MongoDB Schema MongoLab Mockaroo
  • 69. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Recursos de la presentación http://twitter.com/victor_cuervo https://github.com/victorcuervo/mongodb-codemotion http://www.slideshare.net/victorcuervo/
  • 70. MADRID · NOV 27-28 · 2015{twitter:”@victor_cuervo”} Preguntas