2. Mi primera aplicación con MongoDB
{ nombre: “Alejandro Mancilla”,
puesto: “Senior Solutions Architect, LATAM”,
email: “alejandro.mancilla@mongodb.com”,
twitter_id: “@alxmancilla” }
3. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Agenda
• Breve introducción a MongoDB
• Vocabulario básico
• Instalación de MongoDB
• Construcción de una aplicación básica
• Añadir un índice
• Optimización de consultas con explain()
4. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
DBs relacionales
Expressive Query Language
& Secondary Indexes
Data Integrity
Enterprise Management
& Integrations
5. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
El mundo ha cambiado
Datos Riesgo Tiempo Costos
6. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Scalability
& Performance
Always On,
Global Deployments
FlexibilityExpressive Query Language
& Secondary Indexes
Data Integrity
Enterprise Management
& Integrations
DBs NoSQL
7. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Arquitectura Nexus
Scalability
& Performance
Sharding
Always On,
Global Deployments
Replica Set
Flexibility
Modelo documentalExpressive Query Language
& Secondary Indexes
MongoDB Query Language - MQL
Data Integrity
Enterprise Management
& Integrations
Ops Manager, BI Connector,
Compass, Drivers
MongoDB combina lo mejor de ambos mundos
8. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Vocabulario básico
Relacional MongoDB
Base de datos Base de datos
Tabla Colección
Registro Documento
Índice Índice
Joins Subdocumento / Lookup
Llave foránea Referencia
Transacción multi-tabla Transacción en un documento
9. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Modelo Documental
• No nos referimos a documentos PDFs, Microsoft Word o HTML
• Los documentos son estructuras anidadas usando Javascript Object Notation (JSON)
{
name : “Alejandro Mancilla”,
title : “Senior Solutions Architect”,
employee_number : 999,
location : {
type : “Point”,
coordinates : [ 43.34, -3.26 ]},
expertise: [ “MongoDB”, “Java”, “Python” ],
address : {
address1 : “Av. Javier Barros Sierra 495”,
address2 : “Santa Fe, CDMX”,
zipcode : “01234”,
}
}
10. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Documentos son Estructuras Ricas
{
name : “Alejandro Mancilla”,
title : “Senior Solutions Architect”,
employee_number : 999,
location : {
type : “Point”,
coordinates : [ 43.34, -3.26 ]},
expertise: [ “MongoDB”, “Java”, “Python” ],
address : {
address1 : “Av. Javier Barros Sierra 495”,
address2 : “Santa Fe, CDMX”,
zipcode : “01234”,
}
}
Campos pueden contener
sub-documentos
Tipos de valores de campos
Campos pueden contener arreglos
Campos
11. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
• Desde la primera versión, ya era una base de datos JSON nativa
• Entiende y puede indexar las subestructuras
• Almacena JSON como un formato binario serializado llamado
BSON
• Eficiente para codificación y decodificación para transmisión de red
• MongoDB puede crear índices en cualquier campo del documento
MongoDB realmente habla JSON
12. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
MongoDB lo tiene todo
Consultas
Ricas
Encontrar a todos los Solution Architects
Encontrar a todos los empleados que saben Java en
Support o Consulting
Geoespacial
Encontrar a todos los empleados actualmente en
México
Búsqueda
Textual
Encontrar a todos los empleados que se describan a sí
mismos como “self-driven”
Agregación
Calcular la distancia promedio a la Oficina para todos
los empleados
Map Reduce
¿Cuáles son los skills mas comunes por region en el
tiempo? (es node.js una moda en Brasil?)
13. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Desarrollo – en el pasado
{ CODE } DB SCHEMAXML CONFIG
APPLICATION RELATIONAL DATABASE
OBJECT RELATIONAL
MAPPING
14. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Desarrollo con MongoDB
{ CODE } DB SCHEMAXML CONFIG
APPLICATION RELATIONAL DATABASE
OBJECT RELATIONAL
MAPPING
15. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Instalando MongoDB
$ curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-3.6.3.tgz
$ tar xzvf mongodb-osx-ssl-x86_64-3.6.3.tgz
x mongodb-osx-x86_64-3.6.3/README
x mongodb-osx-x86_64-3.6.3/THIRD-PARTY-NOTICES
x mongodb-osx-x86_64-3.6.3/MPL-2
x mongodb-osx-x86_64-3.6.3/GNU-AGPL-3.0
x mongodb-osx-x86_64-3.6.3/bin/mongodump
x mongodb-osx-x86_64-3.6.3/bin/mongorestore
x mongodb-osx-x86_64-3.6.3/bin/mongoexport
x mongodb-osx-x86_64-3.6.3/bin/mongoimport
x mongodb-osx-x86_64-3.6.3/bin/mongostat
x mongodb-osx-x86_64-3.6.3/bin/mongotop
x mongodb-osx-x86_64-3.6.3/bin/bsondump
x mongodb-osx-x86_64-3.6.3/bin/mongofiles
x mongodb-osx-x86_64-3.6.3/bin/mongoreplay
x mongodb-osx-x86_64-3.6.3/bin/mongoperf
x mongodb-osx-x86_64-3.6.3/bin/mongod
x mongodb-osx-x86_64-3.6.3/bin/mongos
x mongodb-osx-x86_64-3.6.3/bin/mongo
x mongodb-osx-x86_64-3.6.3/bin/install_compass
$ mkdir /data/webinar
16. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Ejecutando mongod
mancilla:mongodb-osx-x86_64-3.6.3 mancilla$ ./bin/mongod -dbpath /data/webinar
2018-03-02T00:26:35.757-0600 I CONTROL [initandlisten] MongoDB starting : pid=62447 port=27017
dbpath=data 64-bit host=mancilla.local
2018-03-02T00:26:35.758-0600 I CONTROL [initandlisten] db version v3.6.3
2018-03-02T00:26:35.758-0600 I CONTROL [initandlisten] git version:
9586e557d54ef70f9ca4b43c26892cd55257e1a5
2018-03-02T00:26:35.758-0600 I CONTROL [initandlisten] OpenSSL version: OpenSSL 0.9.8zh 14 Jan 2016
2018-03-02T00:26:35.758-0600 I CONTROL [initandlisten] allocator: system
2018-03-02T00:26:35.758-0600 I CONTROL [initandlisten] modules: none
2018-03-02T00:26:35.758-0600 I CONTROL [initandlisten] build environment:
2018-03-02T00:26:35.758-0600 I CONTROL [initandlisten] distarch: x86_64
2018-03-02T00:26:35.758-0600 I CONTROL [initandlisten] target_arch: x86_64
2018-03-02T00:26:35.758-0600 I CONTROL [initandlisten] options: { storage: {dbPath: "/data/webinar" }
}2018-03-02T00:26:35.759-0600 I STORAGE [initandlisten] wiredtiger_open config:
create,cache_size=7680M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statis
tics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=
100000),statistics_log=(wait=0),verbose=(recovery_progress),
2018-03-02T00:26:36.861-0600 I CONTROL [initandlisten]
2018-03-02T00:26:37.236-0600 I NETWORK [initandlisten] waiting for connections on port 27017
17. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Interactuando via mongo shell
mancilla$ ./bin/mongo
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017/
MongoDB server version: 3.6.3
> show databases
local 0.000GB
18. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Insertando tu primer documento
> use webinar
switched to db webinar
> show databases
local 0.000GB
> db.demo.insert({"nombre": "amancilla", "fecha": new ISODate()})
WriteResult({ "nInserted" : 1 })
> show databases
webinar 0.000GB
local 0.000GB
> show collections
demo
> db.demo.findOne()
{
"_id" : ObjectId("5a98f27946b52ff3efab305c"),
"nombre" : "amancilla",
"fecha" : ISODate("2018-03-01T16:43:05.001Z")
}
>
19. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Object ID
5a98f27946b52ff3efab305c
TS------ID----PID-Count-
20. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Usando Compass
21. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Una aplicación simple de Blog
• Creemos un gestor de blogs con:
• Artículos
• Usuarios
• Comentarios
22. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Típico Diagrama Entidad-Relación
User
·Name
·Email address
Category
·Name
·URL
Comment
·Comment
·Date
·Author
Article
·Name
·Slug
·Publish date
·Text
Tag
·Name
·URL
23. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
En MongoDB construimos orgánicamente
> use blog
switched to db blog
> db.users.insert( { "username" : "amancilla", "password"
: "top secret", "lang" : "ES" } )
WriteResult({ "nInserted" : 1 })
> db.users.findOne()
{
"_id" : ObjectId("573afff65ee4be80385332a7"),
"username" : "amancilla",
"password" : "top secret",
"lang" : "ES"
}
24. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
¿Cómo hacemos esto en un programa?
package com.mongodb.webinar;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
public class Demo {
public static void main(String[] args) {
MongoClient client = new MongoClient();
MongoDatabase blog = client.getDatabase("blog");
MongoCollection<Document> users = blog.getCollection("users");
Document user = new Document("user", "amancilla")
.append("password", "top secret")
.append("lang", "ES");
users.insertOne(user);
}
}
25. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Continuemos con artículos
import [+]
import static java.util.Arrays.asList;
public class Demo {
public static void main(String[] args) {
MongoClient client = new MongoClient();
MongoDatabase blog = client.getDatabase("blog");
MongoCollection<Document> articulos = blog.getCollection("articles");
String myName = "amancilla";
Document articulo = new Document(”title","My article")
.append("author", myName)
.append("body", "Lorem ipsum dolor sit amet, […] commodo consequat.")
.append("tags", asList("demo","español","MongoDB"));
articulos.insertOne(articulo);
}
}
26. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Creemos un nuevo tipo de artículo
public class Demo {
static DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"
, Locale.ENGLISH);
public static void main(String[] args) {
MongoClient client = new MongoClient();
MongoDatabase blog = client.getDatabase("blog");
MongoCollection<Document> articulos = blog.getCollection("articles");
String myName = "amancilla";
Document articulo = new Document(”title","My article")
.append("author", myName)
.append("body", "Lorem ipsum dolor sit amet […] commodo consequat.")
.append("tags", asList("demo", "español", "MongoDB"))
.append("postdate", new Date());
articulos.insertOne(articulo);
}
}
27. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Insertemos muchos artículos
public class Demo {
static DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"
, Locale.ENGLISH);
public static void main(String[] args) {
MongoClient client = new MongoClient();
MongoDatabase blog = client.getDatabase("blog");
MongoCollection<Document> articulos = blog.getCollection("articles");
List<Document> list = new ArrayList<Document>();
for (int i=0; i<1000000; i++){
Document articulo = new Document("title”, "Mi artículo " + i)
.append("author", "USER_" + Math.round(Math.random()*10000))
.append("body", "Lorem ipsum dolor sit amet, […] ex ea commodo consequat.")
.append("tags", asList("demo", "español", "MongoDB"))
.append("postdate", new Date());
list.add(articulo);
if (i % 5000 == 4999){
articulos.insertMany(list);
list.clear();
}
}
}
}
39. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Etapas de ejecución del plan de consulta
• COLLSCAN : para un escaneo de colección
• IXSCAN : para un escaneo de índices
• FETCH : para recuperar documentos
• SHARD_MERGE : para fusionar resultados de shards
41. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Introducción a índices
• Tome en cuenta lo siguiente
• Background : Cree un índice en background, en lugar de bloquear la base de datos
• Unicidad : Todas las claves en la colección deben ser únicas. Las inserciones de
claves duplicadas se rechazarán con un error.
• Nombre : nombrar explícitamente un índice. De lo contrario, el nombre del índice se
genera automáticamente a partir de los campos de índice.
• Para eliminar un índice
• db.users.dropIndex({ “username” : 1 })
• Obtener todos los índices de una colección
• db.users.getIndexes()
44. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
Drivers y Frameworks
45. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
En MongoDB 4.0 tendremos
transacciones multi-documentos
46. { webinar: “Mi primera aplicación con MongoDB”, twitter_id: “@alxmancilla”, tags: [“#MongoDB”, ”#DataDayMX”] }
¿Qué hemos aprendido?
• Cómo crear una base de datos y una colección
• Cómo insertar documentos
• Cómo realizar búsquedas
• Cómo hacer modificaciones de los documentos existentes
• Cómo borrar documentos
• Cómo comprobar la eficiencia de una operación
• Cómo crear índices
• Cómo averiguar los índices que se utilizan en una operación