MongoDB y Bluemix
“Ejecutando MongoDB en un PaaS”
{ nombre:”Víctor Cuervo” }
http://twitter.com/victor_cuervo
https://github.com/victorcuervo/lineadecodigo_mongodb
http://www.slideshare.net/victorcuervo/
http://lineadecodigo.com
Disclaimer
¿Qué es MongoDB?
MongoDB para Iniciados
Cosas diferentes en MongoDB
Servicio MongoDB en Bluemix
Compose.io y Bluemix
Recursos
2
3
4
5
6
Índice
1
¿Qué es MongoDB?
MongoDB y Bluemix
1
SELECT array_agg(players), player_teams
FROM (
SELECT DISTINCT t1.t1player AS players, t1.player_teams
FROM (
SELECT
p.playerid AS t1id,
concat(p.playerid,':', p.playername, ' ') AS t1player,
array_agg(pl.teamid ORDER BY pl.teamid) AS player_teams
FROM player p
LEFT JOIN plays pl ON p.playerid = pl.playerid
GROUP BY p.playerid, p.playername
) t1
INNER JOIN (
SELECT
p.playerid AS t2id,
array_agg(pl.teamid ORDER BY pl.teamid) AS player_teams
FROM player p
LEFT JOIN plays pl ON p.playerid = pl.playerid
GROUP BY p.playerid, p.playername
) t2 ON t1.player_teams=t2.player_teams AND t1.t1id <> t2.t2id
) innerQuery
GROUP BY player_teams
¿Qué hace esto?
MongoDB es una base de datos opensource NOSQL basada en
documentos. Es creada por la empresa 10gen, la cual se transforma a
posteriori en MongoDB Inc.
El nombre de MongoDB proviene de “humongous”, que significa enorme en
inglés.
La web de MongoDB está accesible en http://www.mongodb.org
¿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, node.js, go,…
• Maneja bases de datos, colecciones, campos, indices,…y no permite hacer
un xxxxxx join. $lookup
¿Qué es MongoDB?
Documento BSON
{
"_id": ObjectId("565914732c23d80f730a1f49"),
"gender": "M",
"name": “Julio Sanchez",
"username": "jsanchezs",
"birthday": "06/11/1977",
"email": "jsanchez@gmail.com",
"social": {
"facebook": “http://facebook.com/julio.sanchez“,
"twitter": “http://twitter.com/jjsanch“,
"linkedin": “http://es.linkedin.com/juliosanchez“
},
"description": "Soy una persona afable, estudioso y amigo de mis amigos.”,
"hobbies": [
"python",
"angularjs",
"mongodb"
]
}
MongoDB para Iniciados
MongoDB y Bluemix
2
• Las operaciones del CRUD en MongoDB se realizan con los métodos:
• Insert
• Find
• Update/Save
• Delete
• Siempre se antepone el nombre de la colección:
db.collection.operacion({documento})
• El contenido de la operación siempre será un documento JSON.
CRUD
Consultas
• Consulta Básica
db.ciudades.find({ciudad:’Madrid'});
• Consulta con Filtro
db.ciudades.find({
habitantes:{$lt:400000}
});
• Ordenaciones
db.ciudades.find().sort({
ciudad:1
});
• Consultas con conjuntos
db.ciudades.find({ciudad:
{$in:[‘Avila','Zamora','Madrid']}});
• Projection
db.ciudades.find({
habitantes:{$gt:1000000}},
{ciudad:1});
Actualizaciones
• Actualización Básica
db.ciudades.update(
{ciudad:'Avila'},
{$set:{habitantes:58915}
});
• Actualización Múltiple
db.ciudades.update({
habitantes:{$gt:600000}},
{$set:{‘grande’:true}},
{multi:true}
);
• Upsert - Se puede hacer con un
Save
db.ciudades.update({
ciudad:'Zamora'},
{$set:{habitantes:65362}},
{upsert:true}
);
• Inserción
db.ciudades.insert(
{'ciudad':'Avila',
‘habitantes':58915}
);
• Borrado
db.ciudades.delete(
{ciudad:’Zamora’}
);
Insercción y Borrado
Cosas diferentes en MongoDB
MongoDB y Bluemix
3
Modelos de Datos con Arrays
• Una de las características de MongoDB es poder
crear campos que sean arrays de datos.
• Los Arrays pueden contener valores o una colección
de subdocumentos.
• Existen los operadores $push, $pull, $each que nos
ayudan a manipular los arrays.
{
…
“hobbies": [
"python",
"angularjs",
"mongodb"
]
…
}
• $push - Insertar un elemento en el array
db.users.update({username:"rigodon"},{$push:{hobbies:"Javascript"}})
• $each - Insertar N elementos en el array
db.users.update({username:"rigodon"},
{$push:{hobbies:{$each:["Java","Python","AngularJS"]}}})
• $pull - Eliminar un elemento del array
db.users.update({username:"rigodon"},
{$pull:{hobbies:"Java"}})
Manipulando Arrays
Servicio MongoDB en Bluemix
MongoDB y Bluemix
4
MongoDB en Bluemix
• Sobre nuestra aplicación de
Bluemix añadiremos el
servicio de MongoDB o
enlazaremos el servicio si ya
lo hemos instanciado.
• El servicio MongoDB de Bluemix es un servicio experimental
– Se encuentra en el Bluemix Labs Catalog (*)
• Está catalogado como Data and Analytics
• En estos momentos está disponible la versión MongoDB 2.4
• Plan gratuito de consumo
• Dedicated server, shared VM, 250MB storage, 100 connections
Servicio MongoDB
(*) https://console.ng.bluemix.net/catalog/labs/
{
"mongodb-2.4": [
{
"name": "mongodb-7b",
"label": "mongodb-2.4",
"plan": "100",
"credentials": {
"hostname": "75.126.37.98",
"host": "75.126.37.98",
"port": 10063,
"username": "1c20340a-5bf8-495e-b9d9-2e613ceefd40",
"password": "121cb836-5c58-4b99-b0f4-cf7d300258bf",
"name": "c51db93c-11cb-461d-9c65-7dec81222485",
"db": "db",
"url": "mongodb://1c20340a-5bf8-495e-b9d9-2e613ceefd40:121cb836-5c58-4b99-b0f4-cf7d300258bf@75.126.37.98:10063/db"
}
}
]
}
VCAP_CREDENTIALS
# Crear el servicio
$ cf create-service mongodb 100 mongodb01
# Hacer el binding
$ cf bind-service AppName mongodb01
# Subir la aplicación
$ cf push
Comandos
•A parte de utilizar la consola de
Bluemix podemos utilizar los
comandos de Cloudfoundry para
crear el servicio, enlazar el
servicio a la aplicación y subir la
aplicación
from pymongo import MongoClient
vcap_config = os.environ.get('VCAP_SERVICES')
decoded_config = json.loads(vcap_config)
for key, value in decoded_config.iteritems():
if key.startswith('mongodb'):
mongo_creds = decoded_config[key][0][‘credentials’]
mongo_url = str(mongo_creds['url'])
client = MongoClient(mongo_url)
Codificando: Dependencias y Credenciales
Flask==0.10.1
pymongo>=3.2
Requirements.txt Welcome.py
client = MongoClient(mongo_url)
db = client.db
listado = db.listado
lista = listado.find({'pais':'Spain'})
.sort('nombre',1)
Codificando: Acceso a MongoDB
Insertar.py Consultar.py
client = MongoClient(mongo_url)
db = client.db
listado = db.listado
docs = [{'codigo':'1','valor':'A'},
{'codigo':'2','valor':'B'},
{'codigo':'3','valor':'C'},
{'codigo':'4','valor':'D'}]
listado.insert_many(docs)
Vamos a la demo
¿Qué puede salir mal?
• Importante utilizar una librería de logging.
• Se puedes comprobar los logs desde la Consola BlueMix
• O bien comprobarlos desde un terminal mediante el comando
$ cf logs AppName —recent
Depurando nuestro código
• Permisos del usuario de MongoDB
– Solo se tiene acceso a la base de datos “db”
• No puedes operar como admin
• No se puede acceder a la consola de MongoDB
• La versión de MongoDB es la 2.4 (actualmente ya existe 3.2)
Limitaciones MongoDB en Bluemix
Compose.io y Bluemix
MongoDB y Bluemix
5
• Compose.IO ofrece diferentes soluciones
de bases de datos en formato DBaaS
• MongoDB, ElasticSearch, Redis,
Postgresql,…
• Proporciona un interface de usuario
amigable para operar MongoDB, así
como múltiples formas de conectarnos.
• http://compose.io
¿Qué es Compose.io?
• Servicio MongoDB by Compose nos permite acceder a un
MongoDB instanciado como DBaaS
• Está catalogado como Data and Analytics
• La información de conexión debe de proporcionarla el usuario
• Plan gratuito de consumo
Servicio Compose MongoDB
(*) https://console.ng.bluemix.net/catalog/labs/
{
"user-provided": [
{
"name": "MongoDB by Compose-gk",
"label": "user-provided",
"credentials": {
"uri": "aws-us-east-1-portal.14.dblayer.com",
"port": "10020",
"user": "victorcuervo",
"password": “lamassecretadelmundo"
}
}
]
}
VCAP_CREDENTIALS
Enséñam
e
un
poquito
Recursos
MongoDB y Bluemix
6
• Tutorial sobre MongoDB
https://docs.mongodb.org/manual/tutorial/
• Novedades de MongoDB 3.2
https://docs.mongodb.org/manual/release-notes/
• Ejemplos de MongoDB
http://lineadecodigo.com/mongodb
• Documentación y ejemplos de MongoDB en Bluemix
https://console.ng.bluemix.net/docs/#services/MongoDB/index.html#MongoDB
• Compose.io
http://compose.io
Enlaces de Interés
Preguntas
¡Gracias!

MongoDB y bluemix

  • 1.
    MongoDB y Bluemix “EjecutandoMongoDB en un PaaS”
  • 2.
    { nombre:”Víctor Cuervo”} http://twitter.com/victor_cuervo https://github.com/victorcuervo/lineadecodigo_mongodb http://www.slideshare.net/victorcuervo/ http://lineadecodigo.com
  • 3.
  • 4.
    ¿Qué es MongoDB? MongoDBpara Iniciados Cosas diferentes en MongoDB Servicio MongoDB en Bluemix Compose.io y Bluemix Recursos 2 3 4 5 6 Índice 1
  • 5.
  • 6.
    SELECT array_agg(players), player_teams FROM( SELECT DISTINCT t1.t1player AS players, t1.player_teams FROM ( SELECT p.playerid AS t1id, concat(p.playerid,':', p.playername, ' ') AS t1player, array_agg(pl.teamid ORDER BY pl.teamid) AS player_teams FROM player p LEFT JOIN plays pl ON p.playerid = pl.playerid GROUP BY p.playerid, p.playername ) t1 INNER JOIN ( SELECT p.playerid AS t2id, array_agg(pl.teamid ORDER BY pl.teamid) AS player_teams FROM player p LEFT JOIN plays pl ON p.playerid = pl.playerid GROUP BY p.playerid, p.playername ) t2 ON t1.player_teams=t2.player_teams AND t1.t1id <> t2.t2id ) innerQuery GROUP BY player_teams ¿Qué hace esto?
  • 8.
    MongoDB es unabase de datos opensource NOSQL basada en documentos. Es creada por la empresa 10gen, la cual se transforma a posteriori en MongoDB Inc. El nombre de MongoDB proviene de “humongous”, que significa enorme en inglés. La web de MongoDB está accesible en http://www.mongodb.org ¿Qué es MongoDB?
  • 9.
    • Base dedatos 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, node.js, go,… • Maneja bases de datos, colecciones, campos, indices,…y no permite hacer un xxxxxx join. $lookup ¿Qué es MongoDB?
  • 10.
    Documento BSON { "_id": ObjectId("565914732c23d80f730a1f49"), "gender":"M", "name": “Julio Sanchez", "username": "jsanchezs", "birthday": "06/11/1977", "email": "jsanchez@gmail.com", "social": { "facebook": “http://facebook.com/julio.sanchez“, "twitter": “http://twitter.com/jjsanch“, "linkedin": “http://es.linkedin.com/juliosanchez“ }, "description": "Soy una persona afable, estudioso y amigo de mis amigos.”, "hobbies": [ "python", "angularjs", "mongodb" ] }
  • 11.
  • 12.
    • Las operacionesdel CRUD en MongoDB se realizan con los métodos: • Insert • Find • Update/Save • Delete • Siempre se antepone el nombre de la colección: db.collection.operacion({documento}) • El contenido de la operación siempre será un documento JSON. CRUD
  • 13.
    Consultas • Consulta Básica db.ciudades.find({ciudad:’Madrid'}); •Consulta con Filtro db.ciudades.find({ habitantes:{$lt:400000} }); • Ordenaciones db.ciudades.find().sort({ ciudad:1 }); • Consultas con conjuntos db.ciudades.find({ciudad: {$in:[‘Avila','Zamora','Madrid']}}); • Projection db.ciudades.find({ habitantes:{$gt:1000000}}, {ciudad:1});
  • 14.
    Actualizaciones • Actualización Básica db.ciudades.update( {ciudad:'Avila'}, {$set:{habitantes:58915} }); •Actualización Múltiple db.ciudades.update({ habitantes:{$gt:600000}}, {$set:{‘grande’:true}}, {multi:true} ); • Upsert - Se puede hacer con un Save db.ciudades.update({ ciudad:'Zamora'}, {$set:{habitantes:65362}}, {upsert:true} );
  • 15.
  • 16.
    Cosas diferentes enMongoDB MongoDB y Bluemix 3
  • 17.
    Modelos de Datoscon Arrays • Una de las características de MongoDB es poder crear campos que sean arrays de datos. • Los Arrays pueden contener valores o una colección de subdocumentos. • Existen los operadores $push, $pull, $each que nos ayudan a manipular los arrays. { … “hobbies": [ "python", "angularjs", "mongodb" ] … }
  • 18.
    • $push -Insertar un elemento en el array db.users.update({username:"rigodon"},{$push:{hobbies:"Javascript"}}) • $each - Insertar N elementos en el array db.users.update({username:"rigodon"}, {$push:{hobbies:{$each:["Java","Python","AngularJS"]}}}) • $pull - Eliminar un elemento del array db.users.update({username:"rigodon"}, {$pull:{hobbies:"Java"}}) Manipulando Arrays
  • 19.
    Servicio MongoDB enBluemix MongoDB y Bluemix 4
  • 20.
    MongoDB en Bluemix •Sobre nuestra aplicación de Bluemix añadiremos el servicio de MongoDB o enlazaremos el servicio si ya lo hemos instanciado.
  • 21.
    • El servicioMongoDB de Bluemix es un servicio experimental – Se encuentra en el Bluemix Labs Catalog (*) • Está catalogado como Data and Analytics • En estos momentos está disponible la versión MongoDB 2.4 • Plan gratuito de consumo • Dedicated server, shared VM, 250MB storage, 100 connections Servicio MongoDB (*) https://console.ng.bluemix.net/catalog/labs/
  • 22.
    { "mongodb-2.4": [ { "name": "mongodb-7b", "label":"mongodb-2.4", "plan": "100", "credentials": { "hostname": "75.126.37.98", "host": "75.126.37.98", "port": 10063, "username": "1c20340a-5bf8-495e-b9d9-2e613ceefd40", "password": "121cb836-5c58-4b99-b0f4-cf7d300258bf", "name": "c51db93c-11cb-461d-9c65-7dec81222485", "db": "db", "url": "mongodb://1c20340a-5bf8-495e-b9d9-2e613ceefd40:121cb836-5c58-4b99-b0f4-cf7d300258bf@75.126.37.98:10063/db" } } ] } VCAP_CREDENTIALS
  • 23.
    # Crear elservicio $ cf create-service mongodb 100 mongodb01 # Hacer el binding $ cf bind-service AppName mongodb01 # Subir la aplicación $ cf push Comandos •A parte de utilizar la consola de Bluemix podemos utilizar los comandos de Cloudfoundry para crear el servicio, enlazar el servicio a la aplicación y subir la aplicación
  • 24.
    from pymongo importMongoClient vcap_config = os.environ.get('VCAP_SERVICES') decoded_config = json.loads(vcap_config) for key, value in decoded_config.iteritems(): if key.startswith('mongodb'): mongo_creds = decoded_config[key][0][‘credentials’] mongo_url = str(mongo_creds['url']) client = MongoClient(mongo_url) Codificando: Dependencias y Credenciales Flask==0.10.1 pymongo>=3.2 Requirements.txt Welcome.py
  • 25.
    client = MongoClient(mongo_url) db= client.db listado = db.listado lista = listado.find({'pais':'Spain'}) .sort('nombre',1) Codificando: Acceso a MongoDB Insertar.py Consultar.py client = MongoClient(mongo_url) db = client.db listado = db.listado docs = [{'codigo':'1','valor':'A'}, {'codigo':'2','valor':'B'}, {'codigo':'3','valor':'C'}, {'codigo':'4','valor':'D'}] listado.insert_many(docs)
  • 26.
    Vamos a lademo ¿Qué puede salir mal?
  • 28.
    • Importante utilizaruna librería de logging. • Se puedes comprobar los logs desde la Consola BlueMix • O bien comprobarlos desde un terminal mediante el comando $ cf logs AppName —recent Depurando nuestro código
  • 29.
    • Permisos delusuario de MongoDB – Solo se tiene acceso a la base de datos “db” • No puedes operar como admin • No se puede acceder a la consola de MongoDB • La versión de MongoDB es la 2.4 (actualmente ya existe 3.2) Limitaciones MongoDB en Bluemix
  • 30.
  • 31.
    • Compose.IO ofrecediferentes soluciones de bases de datos en formato DBaaS • MongoDB, ElasticSearch, Redis, Postgresql,… • Proporciona un interface de usuario amigable para operar MongoDB, así como múltiples formas de conectarnos. • http://compose.io ¿Qué es Compose.io?
  • 32.
    • Servicio MongoDBby Compose nos permite acceder a un MongoDB instanciado como DBaaS • Está catalogado como Data and Analytics • La información de conexión debe de proporcionarla el usuario • Plan gratuito de consumo Servicio Compose MongoDB (*) https://console.ng.bluemix.net/catalog/labs/
  • 33.
    { "user-provided": [ { "name": "MongoDBby Compose-gk", "label": "user-provided", "credentials": { "uri": "aws-us-east-1-portal.14.dblayer.com", "port": "10020", "user": "victorcuervo", "password": “lamassecretadelmundo" } } ] } VCAP_CREDENTIALS
  • 34.
  • 35.
  • 36.
    • Tutorial sobreMongoDB https://docs.mongodb.org/manual/tutorial/ • Novedades de MongoDB 3.2 https://docs.mongodb.org/manual/release-notes/ • Ejemplos de MongoDB http://lineadecodigo.com/mongodb • Documentación y ejemplos de MongoDB en Bluemix https://console.ng.bluemix.net/docs/#services/MongoDB/index.html#MongoDB • Compose.io http://compose.io Enlaces de Interés
  • 37.
  • 38.