Presentación sobre cómo utilizar MongoDB en Bluemix, ya sea con el servicio de MongoDB o mediante Compose.io
Inicialmente se muestran un poco las capacidades de MongoDB para luego mostrar dos ejemplos montados mediante Python y Flask
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?
7.
8. 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?
9. • 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?
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"
]
}
12. • 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
17. 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"
]
…
}
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
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 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/
23. # 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
24. 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
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)
28. • 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
29. • 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
31. • 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?
32. • 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/
36. • 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