- 1. 1 MongoDB: la BBDD NoSQL ms popular del mercado 21 Mayo de
2014, 9:00-14:00 Parque Tecnolgico de Zamudio. Edificio Tecnalia,
#204, Bizkaia Dr. Diego Lpez-de-Ipia Gonzlez-de-Artaza
[email protected] http://paginaspersonales.deusto.es/dipina
http://www.slideshare.net/dipina Apuntes + Ejemplos + Docs +
Downloads disponibles en:
https://www.dropbox.com/sh/yz51jkr9y6t3c51/iXm679-WvJ/MongoDB
2. 2 Agenda 1. Introduccin a las bases de datos NoSQL a.
Concepto y campos relacionados b. Principales caractersticas c.
Arquitectura de las bases de datos NoSQL d. Taxonoma de soluciones
NoSQL e. Empresas que usan bases de datos NoSQL 2. MongoDB: una
BBDD NoSQL orientada a Documentos a. Introduccin: caractersticas y
arquitectura b. Instalacin sobre diferentes sistemas operativos c.
Utilidades de mongoDB: mongo, mongostat, mongotop, etc. d.
Caractersticas principales: Consultas Ad hoc Indexacin Replicacin
Balanceo de carga Almacenamiento de archivos Agregacin 3. 3 Agenda
Descanso 3. Programacin en MongoDB a. Ejecucin de JavaScript del
lado del servidor b. Programacin de MongoDB desde Java y Python c.
Desarrollo de una aplicacin avanzada con MongoDB 4. Conclusiones a.
Otras alternativas destacables: CouchDB b. Aplicabilidad a mi
empresa 4. 4 Introduccin a NoSQL NoSQL propone que la capa de
persistencia no es necesariamente la responsabilidad de un nico
sistema Mientras que los proveedores de bases de datos relacionales
han pretendido vender su producto como una solucin nica a todos los
problemas NoSQL propone que la mejor herramienta de almacenamiento
para cada propsito sea utilizada NoSQL supone estar abierto y ser
consciente de alternativas, existentes y patrones adicionales y
herramientas para gestionar tus datos. MongoDB debera ser visto
como una alternativa a las bases de datos relacionales 5. 5
Introduccin a NoSQL NoSQL "not only SQL es una categora general de
sistemas de gestin de bases de datos que difiere de los RDBMS en
diferente modos: No tienen schemas, no permiten JOINs, no intentan
garantizar ACID y escalan horizontalmente Tanto las bases de datos
NoSQL como las relacionales son tipos de Almacenamiento
Estructurado. El trmino fue acuado en 1998 por Carlo Strozzi y
resucitado en 2009 por Eric Evans Evans sugiere mejor referirse a
esta familia de BBDD de nueva generacin como Big Data mientras que
Strozzi considera ahora que NoREL es un mejor nombre 6. 6
Introduccin a NoSQL La principal diferencia radica en cmo guardan
los datos (por ejemplo, almacenamiento de un recibo): En una RDBMS
tendramos que partir la informacin en diferentes tablas y luego
usar un lenguaje de programacin en la parte servidora para
transformar estos datos en objetos de la vida real. En NoSQL,
simplemente guardas el recibo: NoSQL es libre de schemas, t no
diseas tus tablas y su estructura por adelantado NoSQL no es la
panacea!!! Si tus datos son relacionales, quedarte con tu RDBMS
sera generalmente la opcin correcta Aunque MongoDB siempre puede
ser una alternativa! 7. 7 Caractersticas principales Fciles de usar
en clsters de balanceo de carga convencionales facilitan
escalabilidad horizontal Guardan datos persistentes (no slo cachs)
No tienen esquemas fijos y permite la migracin del esquema sin
tener que ser reiniciadas o paradas Suelen tener un sistema de
consultas propio en vez de usar un lenguaje de consultas estndar
Tienen propiedades ACID en un nodo del clster y son eventualmente
consistentes en el clster 8. 8 El teorema CAP Teorema de Brewer: es
imposible para un sistema computacional distribuido ofrecer
simultneamente las siguientes tres garantas: Consistencia todos los
nodos ven los mismos datos al mismo tiempo Disponibilidad
(Availability) garantiza que cada peticin recibe una respuesta
acerca de si tuvo xito o no Tolerancia a la particin (Partition) el
sistema continua funcionando a pesar de la prdida de mensajes
Equivalente a: You can have it good, you can have it fast, you can
have it cheap: pick two. 9. 9 ACID vs. BASE En el mundo relacional
estamos familiarizados con las transacciones ACID, que garantizar
la consistencia y estabilidad de las operaciones pero requieren
lockings sofisticados: ACID = Atomicidad, Consistencia, (Isolation)
aislamiento y Durabilidad Las BBDD NoSQL son repositorios de
almacenamiento ms optimistas , siguen el modelo BASE: BAsic
availability el almacn funciona la mayora del tiempo incluso ante
fallos gracias al almacenamiento distribuido y replicado Soft-state
los almacenes no tienen porque ser consistentes ni sus rplicas en
todo momento. El programador puede verificar esa consistencia.
Eventual consistency la consistencia se da eventualmente BASE es
una alternativa flexible a ACID para aquellos almacenes de datos
que no requieren un adherencia estricta al modelo relacional. 10.
10 RDBMS vs. NoSQL Los RDBMS tradicionales nos permiten definir la
estructura de un esquema que demanda reglas rgidas y garantizan
ACID Las aplicaciones web modernas presentan desafos muy distintos
a las que presentan los sistemas empresariales tradicionales (e.j.
sistemas bancarios): Datos a escala web Alta frecuencia de lecturas
y escrituras Cambios de esquema de datos frecuentes Las
aplicaciones sociales (no bancarias) no necesitan el mismo nivel de
ACID Algunas de las opciones de NoSQL actualmente disponibles son:
MongoDB, Cassandra, Jackrabbit , CouchDB, BigTable, Dynamo o Neo4j
11. 11 Por qu necesitas NoSQL? Desafos en tu sistema de informacin
que son difciles de resolver usando tecnologa de bases de datos
relacionales: Tu BBDD no escala a tu trfico a un coste aceptable El
tamao de tu esquema de datos ha crecido desproporcionalmente. Tu
sistema de informacin genera mucho datos temporales que no
corresponden al almacn de datos principal (carritos de compra,
personalizacin de portales) Tu BBDD ha sido desnormalizada por
razones de rendimiento o por conveniencia para utilizar los datos
en una aplicacin Tu dataset tiene grandes cantidades de texto o
imgenes y la columnas como BLOBs Ejecutas consultas contra datos
que no implican relaciones jerrquicas sencillas; recomendaciones o
consultas de inteligencia de negocio. Ejemplo: "all people in a
social network who have not purchased a book this year who are once
removed from people who have Usas transacciones locales que no
necesitan ser muy durables, e.j. Like. Los sites AJAX tienen muchos
casos de uso de este estilo. 12. 12 Arquitectura de las BBDD NoSQL
A menudo ofrecen slo garantas de consistencia dbiles, como por
ejemplo eventual consistency, o transacciones restringidas a
elementos de datos simples Emplean una arquitectura distribuida,
donde los datos se guardan de modo redundante en distintos
servidores, a menudo usando tablas hash distribuidas Suelen ofrecer
estructuras de datos sencillas como arrays asociativos o almacenes
de pares clave-valor 13. 13 Qu tipo de BBDD elijo? Algunas
respuestas pueden encontrarse en: 35+ Use Cases For Choosing Your
Next NoSQL Database http://highscalability.com/blog/2011/6/20
/35-use-cases-for-choosing-your-next- nosql-database.html Five
Reasons to Use NoSQL http://facility9.com/2010/09/five-reasons-
to-use-nosql/ Which freaking database should I use?
http://www.infoworld.com/print/199184 14. 14 DB-Engines Ranking 15.
15 Soluciones Empresariales NoSQL BigTable (column oriented) es un
sistema de gestin de base de datos creado por Google distribuido,
de alta eficiencia y propietario. Google Cloud Datastore (App
Engine NoSQL Data Storage) motor de BBDD NoSQL factorizado de
Google App Engine BBDD de columnas que soporta transacciones ACID,
tiene alta disponibilidad a travs de centros de replicacin y
consultas SQL-like Amazon DynamoDB (row oriented) es un servicio de
bases de datos NoSQL rpido y totalmente gestionado que permite
almacenar y recuperar de manera fcil y econmica cualquier cantidad
de datos y atender cualquier nivel de trfico Comparativa:
http://www.theregister.co.uk/2013/05/16/google_datastore/ 16. 16
Conceptos asociados a BBDD distribuidas Almacenes basados en
columnas y filas. RDBMS almacenan las filas de modo continuo en
disco, mientras que algunas NoSQL guardan as las columnas
Consistencia eventual: si no se realizan nuevas actualizaciones a
un elemento de datos, todos los accesos del elemento devolvern el
ltimo valor actualizado Sharding: es una particin horizontal en una
BBDD donde las filas de una tabla se mantienen de modo separado
Replicacin maestro-maestro es un mtodo de replicacin de BBDD que
permite almacenar datos en un grupo de nodos y su actualizacin por
cualquier miembro del grupo Replicacin maestro-esclavo donde un slo
elemento se designa como maestro de un datastore y es el nico nodo
que permite modificar datos Particionado es la divisin de una BBDD
lgica y sus partes constituyentes en un conjunto de partes
independientes. Modelo de consistencia: contrato entre el
programador y el sistema sobre las garantas de consistencia (write
& read consistency: one, all, quorum, etc.) 17. 17 Taxonoma de
soluciones NoSQL Los principales tipos de BBDD de acuerdo con su
implementacin son los siguientes: Almacenes de Clave-Valor
Almacenes de documentos Grafos 18. 18 BBDD orientadas a Clave-Valor
Su precursor fue Google BigTable Modelo de datos: familia de
columnas, esto es, un modelo tabular donde cada fila puede tener
una configuracin diferente de columnas Ejemplos: HBase, Hypertable,
Cassandra, Riak Buenas en: Gestin de tamao Cargas de escrituras
masivas orientas al stream Alta disponibilidad MapReduce 19. 19
BBDD orientadas a Documentos La precursora fue Lotus Notes Modelo
de datos: colecciones de documentos (JSON, XML, BSON) que contienen
colecciones de claves-valor Ejemplos: CouchDB, MongoDB Buenas en:
Modelado de datos natural Amigables al programador Desarrollo rpido
Orientas a la web: CRUD 20. 20 BBDD orientadas a Grafos Modelo de
datos: grafo de propiedades formado por las entidades nodos,
relaciones y propiedades tanto de nodos como relaciones Ejemplos:
Neo4j Buenas en: Modelar directamente un dominio en forma de grafo,
una manera comn de representar y entender datasets Ofrecer
excelente rendimiento cuando los datos estn interconectados y no
tabulares Realizar operaciones transaccionales que exploten las
relaciones entre entidades 21. 21 El teorema de CAP 22. 22
Persistencia Polglota Toda empresa va a acabar teniendo una
variedad de tecnologas de almacenamiento para diferentes tipos de
datos El cdigo de nuestros sistemas va a tener acceso a diferentes
repositorios de datos Muchos datos seguirn guardndose en almacenes
relacionales pero debemos empezar a preguntarnos cmo queremos
utilizar los datos y slo entonces decidir qu tecnologa es mejor
Usar NoSQL para una caracterstica particular de una aplicacin Rpido
procesado batch Logging distribuido Para grandes tablas Usar una
RDBMS para reporting Se complica la lgica de la aplicacin y el
despliegue Responsabilidades administrativas adicionales Hay que
elegir la herramienta adecuada para cada trabajo! 23. 23
Persistencia Polglota 24. 24 MongoDB Similar a CouchDB Pretende
combinar lo mejor de los almacenes clave/valor, bases de datos de
documentos y RDBMS Hace uso de JSON y tiene su propio lenguaje de
consultas Implementada en C++ Usada por SourceForge, Bit.ly,
Foursquare o GitHub URL: http://www.mongodb.org/ 25. 25 MongoDB (de
la palabra en ingles humongous que significa enorme) es un sistema
de base de datos NoSQL orientado a documentos MongoDB guarda
estructuras de datos en documentos tipo BSON (Binary JSON (JSON
Binario) con un esquema dinmico , haciendo que la integracin de los
datos en ciertas aplicaciones sea mas fcil y rpida. Lo que MongoDB
no puede hacer: No hay tablas de BBDD No hay joins No hay
transacciones Y MongoDB no usa esquemas de datos 26. 26
Caractersticas Principales Modelo de datos basado en documentos
Frente al modelo de datos relacional Consultas ad hoc ndices
secundarios Replicacin Velocidad y durabilidad Escalabilidad 27. 27
Caractersticas Principales Consultas Ad hoc MongoDB soporta la
bsqueda por campos, consultas de rangos y expresiones regulares.
Las consultas pueden devolver un campo especfico del documento pero
tambin puede ser una funcin JavaScript definida por el usuario.
Indexacin Cualquier campo en un documento de MongoDB puede ser
indexado, al igual que es posible hacer ndices secundarios. El
concepto de ndices en MongoDB es similar a los encontrados en base
de datos relacionales. Replicacin MongoDB soporta el tipo de
replicacin maestro-esclavo. El maestro puede ejecutar comandos de
lectura y escritura. El esclavo puede copiar los datos del maestro
y slo se puede usar para lectura o para copia de seguridad, pero no
se pueden realizar escrituras. El esclavo tiene la habilidad de
poder elegir un nuevo maestro en caso del que se caiga el servicio
con el maestro actual. 28. 28 Caractersticas Principales Balanceo
de carga MongoDB se puede escalar de forma horizontal usando el
concepto de shard. El desarrollador elije una llave shard, la cual
determina cmo sern distribuidos los datos en una coleccin. Los
datos son divididos en rangos (basado en la llave shard) y
distribuidos a travs de mltiples shard. Un shard es un maestro con
uno o ms esclavos. MongoDB tiene la capacidad de ejecutarse en
mltiple servidores, balanceando la carga y/o duplicando los datos
para poder mantener el sistema funcionando en caso que exista un
fallo de hardware. Almacenamiento de archivos MongoDB puede ser
utilizado con un sistema de archivos, tomando la ventaja de la
capacidad que tiene MongoDB para el balanceo de carga y la
replicacin de datos utilizando mltiples servidores para el
almacenamiento de archivos. Esta funcin (que es llamada GridFS )
est incluida en los drivers de MongoDB y disponible para los
lenguajes de programacin que soporta MongoDB. Agregacin La funcin
MapReduce y el operador aggregate() puede ser utilizada para el
procesamiento por lotes de datos y operaciones de agregacin. Estos
mecanismos permiten que los usuarios puedan obtener el tipo de
resultado que se obtiene cuando se utiliza el comando SQL group-by.
Ejecucin de JavaScript del lado del servidor MongoDB tiene la
capacidad de realizar consultas utilizando JavaScript, haciendo que
estas sean enviadas directamente a la base de datos para ser
ejecutadas: db.system.js.save
http://docs.mongodb.org/manual/tutorial/store-javascript-function-on-server/
29. 29 Casos de uso de MongoDB Almacenamiento y registro de eventos
Para sistemas de manejo de documentos y contenido Comercio
Electrnico Juegos Problemas de alto volumen Aplicaciones mviles
Almacn de datos operacional de una pgina Web Manejo de contenido
Almacenamiento de comentarios Votaciones Registro de usarios
Perfiles de usuarios Sesiones de datos Proyectos que utilizan
metodologas de desarrollo iterativo o giles Manejo de estadsticas
en tiempo real 30. 30 Cundo usar MongoDB? MongoDB puede ser
utilizado como una alternativa directa a las bases de datos
relacionales Importante considerarlo como una alternativa en vez de
un remplazo Puede hacer muchas cosas que otras herramientas pueden
hacer Algunas cosas las hace mejor y otras peor Aunque no usar
esquemas puede ser cmodo y gil, casi todos los datos son
estructurados El beneficio real es no tener que crear las
estructuras de datos antes de usarlas y reducir el cisma entre OOP
y datos 31. 31 Manipulacin de Datos: colecciones y documentos
MongoDB guarda la estructura de los datos en documentos tipo JSON
con un esquema dinmico llamado BSON, lo que implica que no existe
un esquema predefinido. Los elementos de los datos son llamados
documentos y se guardan en colecciones Una coleccin puede tener un
nmero indeterminado de documentos Las colecciones son como tablas y
los documentos como filas Cada documento en una coleccin puede
tener diferentes campos. La estructura de un documento es simple y
compuesta por key-value pairs parecido a las matrices asociativas
en un lenguaje de programacin Como valor se pueden usar nmeros,
cadenas o datos binarios como imgenes o cualquier otro key-value
pairs. 32. 32 6 Conceptos Clave 1. MongoDB tiene el concepto de
base de datos con el que estamos familiarizados (schema en el mundo
relacional). Dentro de un servidor MongoDB podemos tener 0 o ms
BBDD, cada una actuando como un contenedor de todo lo dems. 2. Una
base de datos puede tener una o ms colecciones, equivalente en el
mundo relacional a una tabla. 3. Las colecciones estn hechas de 0 o
ms documentos, donde un documento puede considerarse equivalente a
una fila de una tabla de un RDBMS. 4. Un documento est compuesto de
uno o varios campos que son equivalentes a las columnas de una
fila. 5. Los ndices en MongoDB funcionan como los de las RDBMS. 6.
Los cursores son utilizados para acceder progresivamente a los
datos recuperados con una consulta Pueden usarse para contar o
moverse hacia delante entre los datos 33. 33 Ejemplo de documento
en MongoDB { "_id": ObjectId("4efa8d2b7d284dad101e4bc7"), "Last
Name": "PELLERIN", "First Name": "Franck", "Age": 29, "Address": {
"Street": "1 chemin des Loges", "City": "VERSAILLES" } } 34. 34
BSON BSON versin binaria de JSON, serializacin codificada en
binario de documentos JSON Soporta colocar documentos dentro de un
documento y arrays dentro de otros documentos y arrays Contiene
extensiones que permiten representar tipos de datos que no son
parte de JSON Por ejemplo, BSON tiene los tipos de datos Date y
BinData BSON soporta los siguientes tipos de datos numricos: int32
- 4 bytes (enteros con signo de 32-bit) int64 - 8 bytes (enteros
con signo de 64-bit) double - 8 bytes (64-bit IEEE 754 de coma
flotante) Documentacin en: http://bsonspec.org/ 35. 35 Claves de
los documentos Adems de los datos de un documento, MongoDB siempre
introduce un campo adicional _id Todo documento tiene que tener un
campo _id nico Este campo _id puede contener un valor de cualquier
tipo BSON, excepto un array Ms info en
http://docs.mongodb.org/manual/core/document/ Podemos generar el
identificador nosotros: x = "55674321R" y =
ObjectId("507f191e810c19729de860ea") o dejarle a MongoDB que lo
haga Entonces el tipo de ese campo es ObjectId:
http://docs.mongodb.org/manual/reference/object-id/ Es un tipo de
datos de 12 bytes, donde 4 bytes representan un timestamp, 3 un
identificador de mquina, 2 el identificador del proceso y 3
restantes un contador Tiene el atributo str y los mtodos
getTimeStamp() y toString() Es preferible que MongoDB lo genere por
nosotros El campo _id es indexado lo que explica que se guardan sus
detalles en la coleccin del sistema system.indexes 36. 36
Utilidades de MongoDB Los siguientes comandos pueden ser instalados
para el manejo y la administracin del sistema de base de datos:
mongo: es un Shell interactivo que permite a los desarrolladores
ver, insertar, eliminar y actualizar datos en su base de datos.
Este tambin permite entre otras funciones la replicacin de
informacin, configurar los Shards, apagar los servidores y ejecutar
JavaScript. mongostat: es una herramienta de lnea de comandos que
muestra en resumen una lista de estadsticas de una instancia de
MongoDB en ejecucin. mongotop: es una herramienta de lnea de
comandos que provee un mtodo para dar seguimiento a la cantidad de
tiempo que dura una la lectura o escritura de datos en una
instancia. mongosniff: es una herramienta de lnea de comandos que
provee un sniffing en la base de datos haciendo un sniffing en el
trfico de la red que va desde y hacia MongoDB.
mongoimport/mongoexport: es una herramienta de lnea de comandos que
facilita la importacin exportacin de contenido desde JSON, CSV o
TSV. mongodump/mongorestore: es una herramienta de lnea de comandos
para la creacin de una exportacin binaria del contenido de la base
de datos. 37. 37 Documentacin e instalacin La documentacin completa
de MongoDB puede encontrarse en: http://docs.mongodb.org/manual/
Instrucciones para instalar MongoDB en Windows: Descargar la ltima
versin de:
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/
Crear directorio de datos: mkdir datadb Ejecutar el comando:
mongod.exe --dbpath datadb Ejecutar: mongod --config mongod.config
Habiendo creado previamente el fichero mongod.config:
dbpath=PATH_TO_WHERE_YOU_WANT_TO_STORE_YOUR_DATABASE Ejecutar el
cliente mongo y los siguientes comandos en JavaScript:
%INSTALL_DIR%mongodb-win32-x86_64-2.4.5bin>mongo MongoDB shell
version: 2.4.5 connecting to: test > db.test.save( {a:1} ) >
db.test.find() { "_id" : ObjectId("4fe6e41b184d3a26629be9b6"), "a"
: 1 } > 38. 38 Ms sobre instalacin en MongoDB El siguiente
enlace contiene ms detalles sobre la instalacin de MongoDB:
http://www.mkyong.com/tutorials/java-mongodb-tutorials/
Instrucciones para instalar MongoDB en Windows: Descargar la ltima
versin (2.6.1) para tu plataforma de:
http://www.mongodb.org/downloads Revisa el directorio de MongoDB
que contendr 10 ejecutables en la carpeta bin Se puede crear un
fichero con las opciones de configuracin por defecto de MongoDB:
mongo.config dbpath=D:mongodbdata #all output go here
logpath=D:mongodblogmongo.log #log read and write operations
diaglog=3 Ejecuta el servidor: mongod --config mongo.config
Conectarse el servidor con el cliente: mongo 39. 39 Usando MongoDB
mongo es un shell JavaScript completo, cualquier funcin JavaScript,
sintaxis o clase puede usarse en el shell > j = { name : "mongo"
}; { "name" : "mongo" } > t = { x : 3 }; { "x" : 3 } >
db.things.save(j); > db.things.save(t); > db.things.find(); {
"_id" : ObjectId("51e50d3b70f9b7c7fdbd8d90"), "name" : "mongo" } {
"_id" : ObjectId("51e50d3b70f9b7c7fdbd8d91"), "x" : 3 } > for
(var i = 1; i db.things.find(); { "_id" :
ObjectId("51e50d3b70f9b7c7fdbd8d90"), "name" : "mongo" } { "_id" :
ObjectId("51e50d3b70f9b7c7fdbd8d91"), "x" : 3 } ... Type "it" for
more > // Iterate through the remaining items > it { "_id" :
ObjectId("51e50d3b70f9b7c7fdbd8da4"), "x" : 4, "j" : 19 } { "_id" :
ObjectId("51e50d3b70f9b7c7fdbd8da5"), "x" : 4, "j" : 20 } 40. 40
Usando MongoDB > // Store the cursor of the DB in a variable
> var cursor = db.things.find(); > while (cursor.hasNext())
printjson(cursor.next()); { "_id" :
ObjectId("51e50d3b70f9b7c7fdbd8d90"), "name" : "mongo" } { "_id" :
ObjectId("51e50d3b70f9b7c7fdbd8d91"), "x" : 3 } ... > // Use
functional features of JavaScript >
db.things.find().forEach(printjson); { "_id" :
ObjectId("51e50d3b70f9b7c7fdbd8d90"), "name" : "mongo" } { "_id" :
ObjectId("51e50d3b70f9b7c7fdbd8d91"), "x" : 3 } ... > // cursors
like an array > var cursor = db.things.find(); >
printjson(cursor[4]); { "_id" :
ObjectId("51e50d3b70f9b7c7fdbd8d94"), "x" : 4, "j" : 3 } > 41.
41 Mongo Shell El shell Mongo se comporta como un buen shell de
UNIX: Ofrece autocompletado (usando el tabulador) Te permite
moverte por la historia de comandos con el cursor para arriba o
abajo o moverte al primer o ltimo comando con las combinaciones de
teclas (CTRL-a y CTRL-e). Ofrece un objeto implcito llamado db que
representa a la base de datos Si no se selecciona explcitamente una
BBDD con el comando use , se conecta por defecto a test Las
colecciones se crean automticamente cuando insertamos el primer
documento en ellas Es un shell en JavaScript que no distingue entre
enteros y nmeros en coma flotante, todo nmero se representa en
JavaScript como un nmero de coma flotante de 64 bits Comandos
tiles: help muestra ayuda db.help() muestra ayuda de los mtodos de
la BBDD db..help() detalla qu mtodos se pueden aplicar a una
coleccin show dbs imprime una lista de las bases de datos del
servidor use cambia la base de datos a , haciendo que db apunte la
BBDD seleccionada show collections imprime todas las colecciones de
la base de datos actual show users imprime los usuarios de la BBDD
42. 42 Mongo Shell Operaciones administrativas: db.cloneDatabase()
clona la base de datos del host especificado db.copyDatabase(, , )
copia de la BBDD del a la base de datos del servidor actual La
instancia de base de datos debe estar en modo noauth.
db.fromColl.renameCollection() renombra la coleccin de fromColl a
toColl db.repairDatabase() repara y compacta la base de datos
actual Esta operacin puede ser muy lenta en bases de datos grandes
db.addUser( , ) aade un usuario a la BBDD actual
db.getCollectionNames() obtiene la lista de colecciones de la base
de datos actual db.dropDatabase() borra la base de datos actual
db.auth(, ) para logearte en un BBDD que exige autenticacin
Formateo de resultados: Para formatear un resultado se puede aadir
el comando .pretty()a la operacin: db..find().pretty() print() para
imprimir sin formateo print(tojson()) para imprimir con formateo
JSON y es equivalente a printjson() printjson() para imprimir con
formateo JSON, equivalente a print(tojson()) Ms documentacin en:
Getting Started with the mongo Shell
http://docs.mongodb.org/v2.2/tutorial/getting-started-with-the-mongo-shell/
43. 43 Documentos de consulta Documentos que indican el patrn de
claves y valores que deben ser localizados Ejemplos: SELECT * FROM
things WHERE name="mongo"
db.things.find({name:"mongo"}).forEach(printjson); SELECT * FROM
things WHERE x=4 db.things.find({x:4}).forEach(printjson); SELECT j
FROM things WHERE x=4 db.things.find({x:4},
{j:true}).forEach(printjson); Recuperar el primer elemento que
cumple alguna restriccin:
printjson(db.things.findOne({name:"mongo"})); Limitar el nmero de
resultados: db.things.find().limit(3); 44. 44 Selectores de
Consulta Los selectores de consulta en MongoDB son como la clusula
where de una sentencia SQL Se usan para encontrar, contar,
actualizar y borrar documentos de una coleccin Un selector es un
objeto JSON, el ms sencillo es {}que sirve para seleccionar todos
los documentos (null tambin funciona). Ejemplos: Para encontrar un
unicornio femenino usaramos {gender:'f'} {field: value} es
utilizado para encontrar cualquier documento donde el campo de
nombre field es igual al valor value {field1: value1, field2:
value2} corresponde a una sentencia de seleccin con el operador
booleano and Los operadores $lt, $lte, $gt, $gte y $ne son usados
para operaciones menor que, menor o igual que, mayor que, mayor o
igual que u operaciones no igual db.unicorns.find({gender: 'm',
weight: {$gt: 700}}) O lo mismo de un modo ms enrevesado
db.unicorns.find({gender: {$ne: 'f'}, weight: {$gte: 701}}) 45. 45
Selectores de Consulta El operador $exists se utiliza para
comprobar la presencia o ausencia de un campo:
db.unicorns.find({vampires: {$exists: false}}) Si queremos utilizar
el operador booleano OR tenemos que hacer uso del operador $or y
asociarle un array de tuplas clave/valor sobre los que realizar el
OR: db.unicorns.find({gender: 'f', $or: [{loves: 'apple'}, {loves:
'orange'}, {weight: {$lt: 500}}]}) Dado que los arrays en MongoDB
son objetos de primera categora se puede comprobar la inclusin de
un elemento dentro de un array al igual que si compararamos con un
nico valor: {loves: 'watermelon'} devolver un documento donde
watermelon es un valor del campo loves Un valor de tipo ObjectId
asociado al campo _id puede seleccionarse como:
db.unicorns.find({_id: ObjectId("TheObjectId")}) 46. 46
Actualizando documentos El comando update tiene dos argumentos: el
selector where a usar y qu campo a actualizar:
db.unicorns.update({name: 'Roooooodles'}, {weight: 590}) Cuidado!!!
Realmente con esa sentencia el documento encontrado que tiene el
nombre dado es remplazado con un nuevo documento que mantiene el
campo _id pero tiene ahora slo el campo adicional weight SOLUCIN
cuando quieres slo cambiar el valor de un campo o varios campos,
hay que usar el modificador $set: db.unicorns.update({weight: 590},
{$set: {name: 'Roooooodles', dob: new Date(1979, 7, 18, 18, 44),
loves: ['apple'], gender: 'm', vampires: 99}}) 47. 47 Modificadores
de update Aparte de $set se pueden utilizar otros modificadores El
modificador $inc se usa para incrementar el campo por una cantidad
positiva o negativa, el tercer argumento lo crea si no exista
db.unicorns.update({name: 'Pilot'}, {$inc: {vampires: -2}}) Si al
unicornio Aurora le gustarn de repente los dulces, podramos aadir
un nuevo valor al campo loves a travs del modificador $push:
db.unicorns.update({name: 'Aurora'}, {$push: {loves: 'sugar'}}) Si
queremos que se cree un nuevo documento cuando intentamos
actualizar uno no existente (upsert) colocamos un tercer parmetro a
true db.hits.update({page: 'unicorns'}, {$inc: {hits: 1}}, true);
Si queremos que update actualice todos los documentos que cumplen
una expresin, un 4 parmetro tiene que ponerse a true
db.unicorns.update({}, {$set: {vaccinated: true }}, false, true);
48. 48 Bsquedas Avanzadas Carga perezosa. Por defecto find devuelve
un cursor cuya recuperacin de datos se pospone hasta que estos son
accedidos realmente, en el shell se pre-recuperan y muestran los
primeros 20 documentos Proyecciones. El comando find()toma un
segundo parmetro que permite seleccionar los campos a mostrar: Por
defecto el campo _id siempre es mostrado a no ser que se le asigne
un 0. El siguiente comando slo muestra el campo name de cada
unicornio db.unicorns.find(null, {name: 1, _id: 0}); Ordenacin. El
mtodo sort() funciona como el selector de las proyecciones, hay que
indicar los campos por los que ordenar, indicando el 1 orden
ascendente y el -1 descendente MongoDB limita el tamao del
sort()cuando se aplica a un campo no indexado.
db.unicorns.find().sort({name: 1, vampires: -1}) Paginacin. Se
soporta con los mtodos de cursor skip y limit
db.unicorns.find().sort({weight: -1}).limit(2).skip(1) Conteo.
Tambin se pueden contabilizar resultados:
db.unicorns.count({vampires: {$gt: 50}}) 49. 49 MongoDB vs. SQL 50.
50 Scripting en MongoDB con JavaScript Cuando escribas scripts en
JS para el shell de mongo hay que tener en cuenta que: Para asignar
un valor a la variable db (u otro nombre de variable) hay que
utilizar el mtodo getDB()o el mtodo connect() conn = new Mongo();
db = conn.getDB("myDatabase"); db =
connect("localhost:27020/myDatabase"); Dentro del script en
JavaScript invoca a db.getLastError() explcitamente para esperar a
la conclusin de la operacin write No se pueden utilizar los
comandos de ayuda del shell, ej. use, show dbs, etc.) dentro de un
fichero JavaScript, dado que no son sentencias vlidas de JavaScript
Shell Helpers JavaScript Equivalents show dbs, show databases
db.adminCommand('listDatabases') use db = db.getSiblingDB('') show
collections db.getCollectionNames() show users
db.system.users.find() show log db.adminCommand( { 'getLog' : '' }
) show logs db.adminCommand( { 'getLog' : '*' } ) it cursor =
db.collection.find() while( cursor.hasNext() ){ cursor.next(); } //
Para imprimir printjson( cursor.next() ); 51. 51 Scripting en
MongoDB con JavaScript Para evaluar cdigo JavaScript desde lnea de
comando: mongo test --eval "printjson(db.getCollectionNames())"
Para ejecutar un fichero con cdigo JavaScript: mongo
localhost:27017/test myjsfile.js Para ejecutar un fichero
JavaScript desde el shell: load("myjstest.js") Ejemplo: mongo
examplesjsShellIntroUnicornsDB.js Documentacin: Write Scripts for
the mongo Shell
http://docs.mongodb.org/manual/tutorial/write-scripts-for-the-mongo-shell/
52. 52 Herramientas grficas para gestionar MongoDB UMongo en un
aplicacin de sobremesa para navegar y administrar un clster MongoDB
Disponible para Linux, Windows and Mac OSX:
http://edgytech.com/umongo/ MongoDB tiene una interfaz
administrativa accesible yendo a: http://localhost:28017/ Se puede
aadir al fichero de configuracin la lnea rest=true o arrancar el
servidor con: mongod --rest Existen varias alternativas en:
http://docs.mongodb.org/ecosystem/tools/administration-interfaces/
Fang of Mongo is a web-based user interface built with Django and
jQuery. Futon4Mongo is a clone of the CouchDB Futon web interface
for MongoDB. 53. 53 GridFS GridFS es una especificacin para guardar
ficheros grandes en MongoDB Aunque MongoDB permite guardar datos
binarios en objetos BSON, su lmite en tamao es de 16 MB Ofrece un
mecanismo para dividir transparentemente un fichero grande en
varios documentos Cada fichero tiene un objeto de metadatos en la
coleccin files y uno o ms objetos chunk en la coleccin chunks URL:
http://www.mongodb.org/display/DOCS/GridFS 54. 54 Esquemas de Datos
orientados a Documentos MongoDB no tiene un esquema fijo del modo
que nos encontramos en las RDBMS Sin embargo, tiene lo que se
denomina como esquema orientado a documentos o esquema orientado a
aplicacin. Consideraciones de Diseo de Modelos de Datos: Tiene
sentido o es posible colocar todos los datos en una coleccin? Hay
algn peligro de alcanzar los 16MB que existen en todo documento en
MongoDB? Cules son los datos que pertenecen a un documento? Se
pueden cambiar los datos en un sitio central (usando referencias)
en vez de cambiarse en el conjunto de documentos que contienen esos
datos? Al final la pregunta es Empotramos o no empotramos un
documento? Dado que MongoDB guarda los datos internamente en
formato Binary JSON (BSON), soporta los tipos de datos de BSON 55.
55 Cuando se crea una aplicacin que usa un RDBMS se pasa un tiempo
considerable diseando las tablas y relaciones entre ellas (database
relational schema) En MongoDB hablamos de diseo de datos dirigido
por la aplicacin, dado que el concepto de modelado de informacin en
forma de documentos es equivalente al modelado basado en objetos de
OOP Como resultado, a menudo haremos pre-joins colocando datos
dentro de un documento que de otro modo estara repartido en varias
tablas en una RDBMS o nuestro cdigo ejecutar programticamente los
JOINs Leer datos de tres documentos implica que MongoDB tendra que
acceder a tres ficheros Leer los datos empotrados en un nico
documento sera mucho ms rpido Hay que tener en cuenta que el tamao
mximo para un documento es de 16MB Por otro lado, no existen
restricciones en MongoDB O juntamos los datos que estn asociados en
un documento o validamos las restricciones programticamente
Modelado de Datos en MongoDB 56. 56 Modelado de Datos en MongoDB La
principal diferencia de una base de datos NoSQL orientada a
documentos como MongoDB es su carencia de JOINs La razn para su
supresin es que los JOINs no suelen ser escalables La solucin es
hacer los JOINs a nivel de aplicacin Si normalizamos nuestros datos
hay que hacer una segunda consulta por cada elemento que quiere
agregarse Ejemplo: Construimos un nuevo documento (objeto) usando
explcitamente el identificador: db.employees.insert({_id:
ObjectId("4d85c7039ab0fd70a117d730"), name: 'Leto'}) Construimos
dos objetos ms haciendo que Leto sea su manager:
db.employees.insert({_id: ObjectId("4d85c7039ab0fd70a117d731"),
name: 'Duncan', manager: ObjectId("4d85c7039ab0fd70a117d730")});
db.employees.insert({_id: ObjectId("4d85c7039ab0fd70a117d732"),
name: 'Moneo', manager: ObjectId("4d85c7039ab0fd70a117d730")});
Para encontrar los empleados cuyo manager es Leto haramos lo
siguiente: db.employees.find({manager:
ObjectId("4d85c7039ab0fd70a117d730")}) 57. 57 En MongoDB se usan
dos tcnicas para modelar relaciones many-to-one y many-to-many,
sobretodo en los casos que el many hace referencia a few Arrays:
db.employees.insert({_id: ObjectId("4d85c7039ab0fd70a117d733"),
name: 'Siona', manager: [ObjectId("4d85c7039ab0fd70a117d730"),
ObjectId("4d85c7039ab0fd70a117d732")] });
db.employees.find({manager: ObjectId("4d85c7039ab0fd70a117d730")})
De modo interesante el mtodo find()funciona independientemente de
si se aplica a un vector a un escalar Documentos empotrados:
db.employees.insert({_id: ObjectId("4d85c7039ab0fd70a117d734"),
name: 'Ghanima', family: {mother: 'Chani', father: 'Paul', brother:
ObjectId("4d85c7039ab0fd70a117d730")} });
db.employees.find({'family.mother': 'Chani'}) Los documentos pueden
ser consultados usando una notacin separada por puntos:
family.mother Otra alternativa es des-normalizar, replicar tus
datos a travs de varias colecciones Es una prctica que
histricamente ya se ha usado en RDBMS por temas de rendimiento
Introduce la complicacin de tener que contrastar las restricciones
de los datos (constraints) a nivel de aplicacin MongoDB tambin
soporta DBRefs: http://docs.mongodb.org/manual/reference/database-
references/ Modelado de Datos en MongoDB 58. 58 Ejemplos de
Relaciones de Datos Relaciones uno a uno (1-1) Los siguientes
aspectos deberan tenerse en cuenta cuando se modelan relaciones uno
a uno: La frecuencia de acceso a los documentos Tamao de los
elementos, teniendo en cuenta la limitacin de 16 MB La atomicidad
de los datos y su consistencia Considera el siguiente cdigo:
db.captains.insert({_id: 'JamesT.Kirk', name: 'James T. Kirk', age:
38, ship:'ussenterprise'}); db.starships.insert({_id :
'ussenterprise', name: 'USS Enterprise', class: 'Galaxy', captain:
'JamesT.Kirk'} ); Un modo ms eficiente, en este caso, es colocar el
documento del capitn dentro del documento nave:
db.starships.insert( {_id: 'ussenterprise1', name: 'USS
Enterprise', class: 'Galaxy', captain: {name: 'James T. Kirk', age:
38}} ); 59. 59 Relaciones uno a muchos (1-N) Si una nave tiene
mucho miembros de tripulacin o una nave tiene muchos instructores
Tiene sentido empotrar la lista de toda la tripulacin o de
instructores dentro del documento nave que tiene un lmite de tamao
de 16 MB? Por tanto, en caso de relaciones 1-N suele ser a menudo
conveniente enlazar documentos entre colecciones y adems hacerlo
desde la coleccin que guarda muchos valores a la coleccin que
guarda slo uno. PISTA. Para tomar una decisin hay que responder a
la siguiente pregunta: Estamos hablando de una relacin 1-N o de
1-pocos? En el segundo caso un array dentro del documento podra ser
una mejor opcin Ejemplo: db.starships.insert( { _id:
'ussenterprise1', name: 'USS Enterprise', class: 'Galaxy', captain:
{ name : 'James T. Kirk', age : 38}, instructors: [1, 2, 3]}
db.instructors.insert( { _id: 1, name : 'Tuvok', candidates : [99,
100], starship: 'ussenterprise1'} ); Ejemplos de Relaciones de
Datos 60. 60 Relaciones muchos a muchos (N-M) Considera la relacin
en la que un candidato puede tener varios instructores y viceversa
Varios candidatos sern asignados a un instructor y un instructor
ser asignado a varios candidatos para que los instruya En esta
relacin tendremos dos colecciones (candidates e instructors) y un
enlace bi- direccional, dado que cada candidato tiene una lista de
instructores y por cada instructor hay una lista de candidatos Si
quisiramos empotrar los candidatos dentro del documento instructor,
sera necesario tener un instructor antes de un candidato, no podran
existir uno sin el otro Ejemplo: db.candidates.insert( { _id : 99,
name : 'Harry Kim', instructors : [1, 2]} ); db.instructors.insert(
{ _id : 1, name : 'Tuvok', candidates : [99, 100], starship:
'ussenterprise1'} ); Recuerda que es tu programa el que tendr que
garantizar la consistencia. Por ejemplo, asegurando que existe un
candidato cuyo _id es 100 Ejemplos de Relaciones de Datos 61. 61
CRUD vs IFUR Trabajamos en un documento implcito llamado db que
representa la base de datos. Si la base de datos no se modifica
explcitamente nos conectamos por defecto a la base de datos test.
Una coleccin (ships) se crea automticamente cuando insertamos un
documento en ella db.ships.insert({'name':'USS
Prometheus','operator':'Starfleet','class':' Prometheus'}) Create
=> Insert Read => Find Update => Update Delete =>
Remove Operaciones CRUD en MongoDB 62. 62 Los mtodos findOne() y
find() usan un documento como primer parmetro y un segundo para
indicar los campos sobre los que realizar la seleccin, observa que
el campo _id se muestra por defecto en los resultados:
db.ships.findOne({'name':'USS Defiant'},
{'class':true,'_id':false}) El mtodo find() devuelve todos los
documentos que cumplen el lo especificado en el documento de
seleccin. En el shell es necesario it para recuperar los siguientes
20 resultados Necesita los operadores de consulta para realizar
consultas ms precisas: Operator Description Sample-Query $gt
greater than db.ships.find({class:{$gt:P'}}) $gte greater than or
equal db.ships.find({class:{$gte:P'}}) $lt less than
db.ships.find({class:{$lt:P'}}) $lte less than or equal
db.ships.find({class:{$lte:P'}}) $exists does an attribute exists
or not db.ships.find({type:{$exists:true}}) $regex Perl-style
pattern matching db.ships.find({name : {$regex:^USSsE}}) $type
search by the type of a certain element in the document
db.ships.find({name : {$type:2}}) Operaciones CRUD en MongoDB:
find() y findOne() 63. 63 Ejemplos de Queries Algunos ejemplos
interesantes con operadores: db.ships.find({class:{$gte:'P'}},
{'name':true, '_id':false}) Con $gt, $gte, $lt y $lte es posible
realizar operaciones de comparacin sobre ciertos valores de un
documento db.ship.find({'type' : {$exists:true}}) El operador
$exists es til para seleccionar aquellos documentos que tienen un
atributo concreto ATENCIN: implcitamente se creara la coleccin
ship!!! 64. 64 Cuidado con el uso por defecto de update que por
defecto remplaza el documento seleccionado con los campos del
documento pasado como segundo argumento, manteniendo slo el campo
_id: db.ships.update({name : 'USS Prometheus'}, {name : 'USS
Something'}) db.ships.find({name : 'USS Something'}).pretty()
Generalmente lo que queremos es remplazar algunos elementos y
mantener el resto intacto con el operador $set:
db.ships.update({name : 'USS Something'}, {$set : {operator :
'Starfleet', class : 'Prometheus'}}) db.ships.find({name : 'USS
Something'}).pretty() Si queremos quitar un conjunto de valores de
un documento se puede hacer uso del operador $unset:
db.ships.update({name : 'USS Prometheus'}, {$unset : {operator :
1}}) Operaciones CRUD en MongoDB: update() 65. 65 Como en todos los
comandos de MongoDB se reutiliza la sintaxis de la operacin find()
para indicar qu documentos se quieren eliminar Si emitimos un
remove() sin parmetros sobre una coleccin eliminar uno a uno todos
los elementos de la coleccin La operacin drop() eliminar todos los
documentos de la coleccin ms rpido ya que no trabaja a nivel de
documento y adems elimina los ndices Para colecciones grandes es
mejor usar drop() y luego recrear los ndices sobre una nueva
coleccin vaca Ejemplos: db.ships.drop(); db.ships.remove({name :
'USS Prometheus'}) Operaciones CRUD en MongoDB: remove() y drop()
66. 66 ndices Los ndices mejoran el rendimiento de las consultas y
operaciones de ordenacin en MongoDB Operan de modo similar a los de
las RDBMS MongoDB los guarda como un B-Tree que permite la
recuperacin de listas de claves ordenadas Se crean con la sentencia
ensureIndex(), identificando el sentido de ordenacin por campo
ascendente (1) o descendente (-1): db.unicorns.ensureIndex({name:
1}); Para conocer los ndices de la coleccin, escribir:
db.unicorns.getIndexes() Y se eliminan con dropIndex():
db.unicorns.dropIndex({name: 1}); Para asegurarnos que el ndice es
nico, usamos el atributo unique: db.unicorns.ensureIndex({name: 1},
{unique: true}); Los ndices tambin pueden ser compuestos:
db.unicorns.ensureIndex({name: 1, vampires: -1}); 67. 67 ndices
Para saber si se est usando un ndice o no, usamos explain():
db.unicorns.find().explain() Si la salida indica que se usa un
cursor de tipo BasicCursor indica el campo no es indexado, se
escanearn ms documentos y tardarn ms las bsquedas u ordenaciones: {
"cursor" : "BasicCursor", // el campo no es indexado "isMultiKey" :
false, "n" : 1, "nscannedObjects" : 12, "nscanned" : 12,
"nscannedObjectsAllPlans" : 12, "nscannedAllPlans" : 12,
"scanAndOrder" : false, "indexOnly" : false, // si la consulta se
puede resolver mirando slo el ndice "nYields" : 0, "nChunkSkips" :
0, "millis" : 0, // indica cunto tard la consulta "indexBounds" : {
}, "server" : "dipinaXPS14z:27017" } 68. 68 ndices Si creamos un
ndice ese campo tendr asociado un ndice de tipo BtreeCursor,
optimizndose las operaciones sobre esos documentos { "cursor" :
"BtreeCursor name_1", // los campos de consulta son indexados
"isMultiKey" : false, "n" : 1, "nscannedObjects" : 1, "nscanned" :
1, "nscannedObjectsAllPlans" : 1, "nscannedAllPlans" : 1,
"scanAndOrder" : false, "indexOnly" : false, "nYields" : 0,
"nChunkSkips" : 0, "millis" : 0, "indexBounds" : { "name" : [ [
"Pilot", "Pilot" ] ] }, "server" : "dipinaXPS14z:27017" } 69. 69
ndices La coleccin db.system.indexes contiene detalles de todos los
ndices de una BBDD de MongoDB: db.system.indexes.find() Es posible
crear ndices sobre atributos que se guardan como arrays de valores,
as todos los valores del array son indizados Sin embargo, slo se
permite un Multikey Index en un ndice Resumen de operaciones de
indexacin: Index Command Creating an index
db.universe.ensureIndex({galaxy : 1}) Dropping an index
db.universe.dropIndex({galaxy : 1}) Creating a compound index
db.universe.ensureIndex({galaxy : 1, quadrant : 1, planet : 0})
Dropping a compound index db.universe.dropIndex({galaxy : 1,
quadrant : 1, planet : 0}) Creating a unique compound index en la
sombra db.universe.ensureIndex({galaxy : 1, quadrant : 1, planet :
0},{unique : true, background:true}) 70. 70 Para hablar con el
servidor de MongoDB, (mongod) debemos hacer uso de un driver, que
enva comandos desde la aplicacin al servidor, usando un enfoque
fire and forget Las escrituras en MongoDB son asncronas, se gana en
rendimiento con el riesgo de perder datos si hay un server crash No
se devuelve un error cuando se produce un insert() o update()que
viola una restriccin del modelo Es necesario invocar explcitamente
a db.getLastError()despus de un insert() Muchas drivers abstraen
esto y proveen un modo de hacer una escritura segura a travs de un
parmetro extra en el insert {safe => true} El shell de mongo lo
enva cada vez que se realiza un insert() o update() Cuando se
programa una aplicacin en mongo debemos decidir si instruir al
driver para que lo haga automticamente o el programador hacerlo
manualmente en ciertas ocasiones Escritura Asncrona 71. 71
Colecciones Restringidas y Durabilidad Adems de escritura rpida
asncrona MongoDB tambin soporta colecciones de tamao limitado
(capped collection) Se crean usando el comando
db.createCollection() db.createCollection('logs', {capped: true,
size: 1048576}) En este caso cuando la coleccin alcance el 1MB los
documentos antiguos son eliminados para hacer espacio Se puede
establecer un lmite en el nmero de documentos con max. Se respecta
el orden de insercin temporal, los resultados son devueltos
ordenados cronolgicamente La propiedad de la Durabilidad se
preserva en MongoDB, en caso de server crash, si se activa el
journal donde se registran todos los cambios por instancia 72. 72
La siguiente tabla muestra las opciones de configuracin para
controlar el modo de escritura y la durabilidad de las operaciones
insert() y update() MongoDB utiliza el nivel acknowledged por
defecto. w indica al driver que espere al reconocimiento de la
escritura y que los ndices no se violen. Los datos todava pueden
perderse dado que los datos puede que no estn en disco j indica al
driver que espere hasta que el cambio ha sido introducido en el
journal. W write mode J journal mode Meaning (Write Concern) 0 0
Unacknowledged. This is fire and forget. 1 0 Acknowledged. Wait for
an acknowledgement that the write was received and no indexes have
been violated. Data can still be lost. This was formally known as
safe-mode and should be the default nowadays in the drivers 1 1
Journaled. The most save configuration by waiting for the write to
the journal to be completed 0 1 Basically the same as above.
Escrituras y Durabilidad 73. 73 Escrituras y Durabilidad: Write
Concerns Acknowledged Journaled 74. 74 Transacciones MongoDB no
soporta transacciones distribuidas y a travs de collecciones
Soporta transacciones atmicas en documentos lo que significa que
uno siempre ver o todos los cambios sobre un documento o ninguno Si
ocurre que los datos se ajustan bien dentro de un documento (tamao
menos a 16 MB), dado que las operaciones a nivel de documento son
atmicos, no sera necesario ms soporte de transacciones. Algunas
alternativas: Estructura la aplicacin de modo que quepa en un slo
documento haciendo uso de atomicidad a nivel de documento de
MongoDB: $inc, $set o algunas ms complejas como findAndModify
http://docs.mongodb.org/manual/reference/command/findAndModify/
Tolerar un poco de inconsistencia Hacer uso de un two-phase commit
programticamente para transacciones con varios documentos: Es
anlogo a crear referencias manuales entre colecciones en joins
http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/
75. 75 Agregacin Las operaciones de agregacin procesan registros de
datos y devuelven resultados Es una tcnica para simplificar cdigo
de aplicacin y limitar el uso de recursos, ya que usa operaciones
nativas en C++ MongoDB 2.2 introdujo una framework de agregacin
modelado en torno al concepto de pipelines de procesamiento de
datos A travs de varios pasos los documentos son transformados en
resultados agregados Filtros, transformaciones, agrupamientos,
ordenacin y cmputos son algunas de las operaciones Adems MongoDB
tambin permite el uso de operaciones MapReduce para hacer agregacin
Finalmente, MongoDB ofrece un conjunto de operadores sencillos de
agregacin como count(), distinct() o group()
http://docs.mongodb.org/manual/reference/operator/aggregation/interface/
Name Description db.collection.aggregate() Provides access to the
aggregation pipeline. db.collection.group() Groups documents in a
collection by the specified key and performs simple aggregation.
db.collection.mapReduce() Performs map-reduce aggregation for large
data sets. 76. 76 MapReduce en MongoDB MapReduce es un enfoque para
procesar datos que tiene dos beneficios: Puede ser paralelizado
permitiendo que largos volmenes de datos sean procesados a travs de
varios cores/CPUs y mquinas Puedes escribir cdigo real en
JavaScript para hacer el procesamiento Se materializa a travs de
dos pasos: 1. Mapear los datos transformando los documentos de
entrada en pares clave/valor 2. Reducir las entradas conformadas
por pares clave y array de valores asociados a esa clave para
producir el resultado final 77. 77 MapReduce en MongoDB 78. 78 En
este ejemplo vamos a contar el nmero de hits por da en una portal
web Donde cada hit est representado con un log como: resource date
index Jan 20 2010 4:30 index Jan 20 2010 5:30 ... Generando tras el
procesamiento la siguiente salida: resource year month day count
index 2010 1 20 2 ... Para la funcin map emitiremos pares
compuestos por una clave compuesta (resource, year, month, day) y
un valor 1, generando dato como: {resource: 'index', year: 2010,
month: 0, day: 20} => [{count: 1}, {count: 1}] La funcin reduce
recoge cada dato intermedio y genera un resultado final: {resource:
'index', year: 2010, month: 0, day: 20} => {count: 3}
Documentacin en:
http://docs.mongodb.org/manual/reference/method/db.collection.mapReduce/
Ejemplo de MapReduce 79. 79 Creamos la coleccin de entrada con un
conjunto de documentos: db.hits.insert({resource: 'index', date:
new Date(2010, 0, 20, 4, 30)}); db.hits.insert({resource: 'index',
date: new Date(2010, 0, 20, 5, 30)}); ... La funcin map: var map =
function() { var key = {resource: this.resource, year:
this.date.getFullYear(), month: this.date.getMonth(), day:
this.date.getDate()}; emit(key, {count: 1}); }; La funcin reduce:
var reduce = function(key, values) { var sum = 0;
values.forEach(function(value) { sum += value['count']; }); return
{count: sum}; }; Ejecutamos mapReduce(): db.hits.mapReduce(map,
reduce, {out: {inline:1}}) Ejemplo de MapReduce 80. 80 Pipeline de
Agregacin MongoDB incorpora un mecanismo para poder agregar datos
de documentos en diferentes pasos Cada paso toma como entrada un
conjunto de documentos y produce un conjunto de documentos como
resultado Hay operaciones que en un paso dado mantendrn el mismo
nmero de documentos de entrada pero hay otras que los puedes
reducir (filtrar) La siguiente tabla muestra equivalencias entre
clusulas de agregacin, incluyendo operaciones de filtrado,
agrupacin, proyeccin, ordenacin y clculo, de SQL a la framework de
agregacin de MongoDB: SQL MongoDB WHERE $match GROUP BY $group
HAVING $match SELECT $project ORDER BY $sort LIMIT $limit SUM $sum
COUNT() db.records.count() 81. 81 Operaciones de la framework de
agregacin en MongoDB Operaciones: $project cambia el conjunto de
documentos modificando claves y valores. Es de tipo 1 a 1 $match es
una operacin de filtrado que reduce el conjunto de documentos
generando un nuevo conjunto de los mismos que cumple alguna
condicin, ej. operator="starfleet" $group hace el agrupamiento en
base a claves o campos indexados, reduciendo el nmero de documentos
$sort ordenar en ascendente o descendente, dado que es
computacionalmente costoso debera ser uno de los ltimos pasos de la
agregacin $skip permite saltar entre el conjunto de documentos de
entrada, por ejemplo avanzar hasta el dcimo documento de entrada.
Se suele usar junto con $limit $limit limita el nmero de documentos
a revisar $unwind desagrega los elementos de un array en un
conjunto de documentos. Esta operacin incrementa el nmero de
documentos para el siguiente paso Ejemplos y documentacin de estos
operadores en:
http://docs.mongodb.org/manual/reference/operator/aggregation-pipeline/
82. 82 Pipeline de Agregacin 83. 83 Agrupacin A menudo agrupamos
documentos para agregar valores en subconjuntos de documentos
Existen varios acumuladores que se pueden aplicar sobre los campos
agrupados Ejemplo, dados un conjunto de artculos:
db.article.aggregate( { $group : { _id : "$author", docsPerAuthor :
{ $sum : 1 }, viewsPerAuthor : { $sum : "$pageViews" } }} ); 84. 84
Acumuladores sobre Grupos Expression Description Example $sum Sums
up the defined value from all documents in the collection
db.ships.aggregate([{$group : {_id : "$operator", num_ships : {$sum
: "$crew"}}}]) $avg Calculates the average of all given values from
all documents in the collection. db.ships.aggregate([{$group : {_id
: "$operator", num_ships : {$avg : "$crew"}}}]) $min Gets the
minimum of the corresponding values from all documents in the
collection. db.ships.aggregate([{$group : {_id : "$operator",
num_ships : {$min : "$crew"}}}]) $max Gets the maximum of the
corresponding values from all documents in the collection.
db.ships.aggregate([{$group : {_id : "$operator", num_ships : {$max
: "$crew"}}}]) $push Pushes the value to an array in the resulting
document db.ships.aggregate([{$group : {_id : "$operator", classes
: {$push: "$class"}}}]) $addToSet Pushes the value to an array in
the resulting document but does not create duplicates.
db.ships.aggregate([{$group : {_id : "$operator", classes :
{$addToSet : "$class"}}}]) $first Gets the first document from the
source documents according to the grouping. Typically this makes
only sense together with some previously applied $sort-stage.
db.ships.aggregate([{$group : {_id : "$operator", first_class :
{$first : "$class"}}}]) $last Gets the last document from the
source documents according to the grouping. Typically this makes
only sense together with some previously applied $sort-stage.
db.ships.aggregate([{$group : {_id : "$operator", last_class :
{$last : "$class"}}}]) 85. 85 Perfiles de Logueo Por defecto
MongoDB registra aquellas consultas cuya ejecucin es ms lenta de
100ms La configuracin de logueo de operaciones puede ser modificada
por la siguiente expresin: mongod --profile --slowmx , donde si
level es: 0 indica que se deshabilita el logeo 1 se loguean slo las
lentas, aquellas que tardan ms que el valor del segundo parmetro 2
se loguean todas las consultas Desde el shell de MongoDB se pueden
consultar y manipular los niveles de logueo con las siguientes
expresiones: db.setProfilingLevel(1, 5); db.getProfilingStatus();
Se pueden visualizar los valores capturados por el profiler de
MongoDB con el comando: db.system.profile.find() 86. 86 Replicacin
La replicacin funciona similar a cmo funciona la replicacin en una
base de datos relacional Replicacin Master-Slave. Las escrituras
son enviadas a un nico servidor, el maestro, que sincroniza su
estado a uno o varios esclavos Todos juntos configuran un
ReplicaSet MongoDB puede ser configurado para soportar lecturas en
esclavos o no, lo cual puede redundar en la distribucin de la carga
a cambio de sufrir en consistencia Si el maestro se cae, un esclavo
es promocionado como mster automticamente Aunque la replicacin
puede mejorar el rendimiento (distribucin de lecturas) su propsito
principal es mejorar en robustez La combinacin de replicacin y
sharding son un enfoque comn Cada shard puede consistir de un
maestro y un esclavo 87. 87 Replicacin 88. 88 Replica Set Todos los
writes van a un nodo primario (mster) pero es posible hacer
lecturas de los nodos secundarios (slave) Cuando se lee de un nodo
esclavo no hay garanta que el dato ledo est actualizado Sin embargo
si slo se lee y escribe del nodo primario s hay garanta de
consistencia En el periodo entre la cada de un nodo primario y un
nuevo nodo primario es elegido, la consistencia est comprometida.
Todo nodo tiene un nivel de prioridad usado en el proceso de
eleccin Si el nivel de prioridad es puesto a 0 , ese nodo no puede
ser nodo primario El modo de escritura en un ReplicaSet est
configurado por: El valor del parmetro w indica el nmero de nodos
que han de reconocer el write. Si tenemos tres nodos, dos puede ser
un buen valor para w, o la alternativa w=majority El valor del
parmetro j. Con el valor 1 los datos se escribirn en el journal del
nodo maestro 89. 89 Replica Set Existen los siguientes tipos de
nodos para configurar un ReplicaSet: Type Allowed to vote Can
become primary Description Regular yes yes This is the most typical
kind of node. It can act as a primary or secondary node. Arbiter
yes no Arbiter nodes are only there for voting purposes. They can
be used to ensure that there is a certain amount of nodes in a
replica set even though there are not that many physical servers.
Delayed yes no Often used as a disaster recovery node. The data
stored here is usually a few hours behind the real working data.
Hidden no no Often used for analytics in the replica set. 90. 90
Ejemplo de Creacin ReplicaSet Revisar documentacin en:
http://docs.mongodb.org/manual/tutorial/deploy-replica-
set-for-testing/ Un listado de mtodos para iniciar la replicacin
disponible en: http://docs.mongodb.org/manual/reference/method/js-
replication/ El fichero examplesjsreplicasetREADME.txt contiene
instrucciones sobre cmo lanzar el Replica Set 91. 91 Sharding
MongoDB soporta auto-sharding, una tcnica de escalabilidad
horizontal que separa datos a travs de varios servidores. Una
implementacin naif podra poner los datos con nombre que empieza
entre A-M en el servidor 1 y el resto en el servidor 2 Sin embargo,
MongoDB es mucho ms sofisticado 92. 92 Sharding El modus operandi
de sharding consiste en dividir una coleccin en varios nodos y
luego acceder a sus contenidos a travs de un nodo especial que acta
como router (mongos) Es una decisin que se toma cuando se despliega
la base de datos, bien siendo normal o usando sharding Para usar
sharding es necesario que cada coleccin declare un shard-key Clave
definida para uno o varios campos de un documento Debe ayudar a
dividir la coleccin en fragmentos (chunks) Los chunks son luego
distribuidos entre nodos, lo ms equitativamente posible La
instancia mongos usa la clave shard-key para determinar el chunk y
as el nodo utilizado Las condiciones que un shard-key ha de cumplir
son: Cada documento tiene un shard-key El valor del shard-key no
puede modificarse Debe ser parte de un ndice y debe ser el primer
campo de un ndice compuesto No puede haber un ndice nico a no ser
que est conformado por el shard-key Si no se usa el shard-key en
una operacin de lectura esta peticin llegar a todos los shards La
clave de shard debe ofrecer suficiente cardinalidad para poder
utilizar todos los shards Documentacin: Convert a Replica Set to a
Replicated Sharded Cluster
http://docs.mongodb.org/manual/tutorial/convert-replica-set-to-replicated-shard-cluster/
93. 93 Herramientas administrativas Se pueden obtener estadsticas
con stats(): db.stats() Sobre una coleccin especfica haramos:
db.unicorns.stats() Los comandos mongodump y mongorestore nos
permiten hacer backups de todas las bases de datos, de una concreta
o de una coleccin: mongodump hace un backup de todas tus bases de
datos en la carpeta dump mongodump --db DBNAME backup de una BBDD
especfica mongodump --collection COLLECTIONAME de una coleccin
concreta mongorestore usa los mismos switches Ms detalles en:
http://docs.mongodb.org/manual/tutorial/backup-databases-with-binary-
database-dumps/ 94. 94 Ejemplos: Guardar la base de datos learn en
el directorio backup: mongodump --db learn --out backup Para
restaurar slo la coleccin unicorns, haramos lo siguiente:
mongorestore --collection unicorns backup/learn/unicorns.bson
Herramientas administrativas 95. 95 Con mongotop es posible ver
cunto tiempo se pasa con las diferentes operaciones en las
diferentes colecciones Desde lnea de comando ejecuta: mongotop El
comando mongostat genera un snapshot del estado general de MongoDB
El parmetro idx miss % indica cmo de bien logra MongoDB ejecutar
lecturas a partir de ndices en memoria Para ms detalles sobre
herramientas de monitorizacin:
http://docs.mongodb.org/manual/administration/monitoring/
Herramientas administrativas 96. 96 MongoDB (2.4.9) Written in: C++
Main point: Retains some friendly properties of SQL. (Query, index)
License: AGPL (Drivers: Apache) Protocol: Custom, binary (BSON)
Master/slave replication (auto failover with replica sets) Sharding
built-in Queries are javascript expressions Run arbitrary
javascript functions at server-side Better update-in-place than
CouchDB Uses memory mapped files for data storage Performance over
features Journaling (with --journal) is best turned on On 32bit
systems, limited to ~2.5Gb An empty database takes up 192Mb GridFS
to store big data + metadata (not actually an FS) Has geospatial
indexing Data center aware Best used: If you need dynamic queries.
If you prefer to define indexes, not map/reduce functions. If you
need good performance on a big DB. If you wanted CouchDB, but your
data changes too much, filling up disks. For example: For most
things that you would do with MySQL or PostgreSQL, but having
predefined columns really holds you back. 97. 97 Programando
MongoDB MongoDB tiene soporte variado de lenguajes y libreras
cliente: http://docs.mongodb.org/ecosystem/drivers/ 98. 98 MongoDB
y Java Para soporte en Java mirar:
http://docs.mongodb.org/ecosystem/drivers/java/
http://docs.mongodb.org/ecosystem/tutorial/getting-
started-with-java-driver/ Algunos buenos ejemplos en:
http://www.mkyong.com/tutorials/java- mongodb-tutorials/
http://www.mkyong.com/mongodb 99. 99 MongoDB y Java Creamos un
proyecto en Maven para compilar y ejecutar nuestros ejemplos en
Java. El siguiente comando crea un proyecto en Java sencillo: mvn
archetype:generate -DgroupId=com.mkyong.core - DartifactId=mongodb
-DarchetypeArtifactId=maven- archetype-quickstart
-DinteractiveMode=false Maven descarga el driver de mongodb
automticamente si su dependencia se declara en pom.xml:
org.mongodbmongo-java-driver2.10.1 Alternativamente se puede
descargar de:
https://github.com/mongodb/mongo-java-driver/downloads 100. 100
Programando en Java 1. Creamos una conexin al servidor MongoDB:
MongoClient mongo = new MongoClient( "localhost" , 27017 ); 2.
Obtenemos una referencia a una BBDD, que MongoDB crea implcitamente
si no existe: DB db = mongo.getDB("testdb"); List dbs =
mongo.getDatabaseNames(); for(String db : dbs){
System.out.println(db); } 3. Obtenemos una referencia a una
coleccin: DBCollection table = db.getCollection("user"); Set tables
= db.getCollectionNames(); for(String coll : tables){
System.out.println(coll); } 101. 101 Programando en Java 4.
Procedemos ahora a realizar las operaciones CRUD, empezando con
creacin, es decir un insert(): BasicDBObject document = new
BasicDBObject(); document.put("name", "diego"); document.put("age",
39); document.put("createdDate", new Date());
table.insert(document); 5. Actualizamos el documento cuando
"name=diego": BasicDBObject query = new BasicDBObject();
query.put("name", "diego"); BasicDBObject newDocument = new
BasicDBObject(); newDocument.put("name", "diego-updated");
BasicDBObject updateObj = new BasicDBObject();
updateObj.put("$set", newDocument); table.update(query, updateObj);
102. 102 Programando en Java 6. Hacemos ahora un bsqueda de docs
con "name=diego": BasicDBObject searchQuery = new BasicDBObject();
searchQuery.put("name", "diego"); DBCursor cursor =
table.find(searchQuery); while (cursor.hasNext()) {
System.out.println(cursor.next()); } 7. Borramos el documento con
"name=diego": DBCollection table = db.getCollection("user");
BasicDBObject searchQuery = new BasicDBObject();
searchQuery.put("name", "diego"); table.remove(searchQuery); 8.
Ejecutamos el programa completo desde examplesjavamongodb folder
con el comando: mvn compile exec:java
-Dexec.mainClass="com.mkyong.core.App" 103. 103 Programando en Java
Para ms documentacin sobre cmo usar la API Java para acceder a
MongoDB revisar: http://api.mongodb.org/java/current/ La carpeta
examplesjavamongodb contiene en su subdirectorio src varios
ejemplos de opciones avanzadas para autenticar, insertar, buscar,
actualizar y borrar documentos extrados de:
http://www.mkyong.com/tutorials/java-mongodb-tutorials/ 104. 104
Autenticacin en MongoDB Para hacer que MongoDB solicite
autenticacin para realizar cualquier operacin de modificacin de la
BBDD, lanzarlo como: mongod auth Una vez logeados primero aadimos
un usario a la base de datos especial admin y luego a la BBDD que
queremos modificar: use admin
db.addUser("admin","your-super-password") db.auth('admin',
'your-super-password'); use testdb db.addUser("mkyong","password")
En el cdigo tenemos ahora que logearnos antes de operar sobre la
BBDD: MongoClient mongo = new MongoClient("localhost", 27017); DB
db = mongo.getDB("testdb"); boolean auth =
db.authenticate("mkyong", "password".toCharArray()); Para probar un
ejemplo de cdigo que autentica ejecutar en examplesjavamongodb: mvn
compile exec:java -
Dexec.mainClass="com.mkyong.core.JavaMongoDBAuthExample" 105. 105
PyMongo: Python y MongoDB Documentacin de la API:
http://api.mongodb.org/python/current/api/index.html Tutorial:
http://api.mongodb.org/python/current/tutorial.html Download el
cdigo fuente de https://github.com/mongodb/mongo-python-driver
Ejecuta el comando python setup.py install Lo primero instalamos
PyMongo The bson package is an implementation of the BSON format
for Python El paquete pymongo es un driver nativo en Python para
MongoDB El paquete gridfs implementa gridfs encima de pymongo Nos
aseguramos que el servidor de mongo est arrancado mongod Ms info
en: https://pypi.python.org/pypi/pymongo/ Para ORMs sobre Python
http://docs.mongoengine.org/en/latest/tutorial.html 106. 106 1.
Hacemos una conexin con la BBDD MongoDB from pymongo import
MongoClient client = MongoClient() Podemos alternativamente hacer
que el cliente mongo (MongoClient) se conecte a otro puerto con el
comando: client = MongoClient('localhost', 27017) O
alternativamente: client =
MongoClient('mongodb://localhost:27017/') 2. Accedemos a la BBDD,
usando el estilo de acceso a atributos o a diccionarios: db =
client.test_database db = client['test-database'] 3. Para acceder a
una coleccin usamos cdigo similar. collection = db.test_collection
collection = db['test-collection'] PyMongo: Python y MongoDB 107.
107 4. Mientras que los datos en MongoDB se representan en JSON, su
equivalencia en pymongo son los diccionarios: El siguiente
diccionario puede usarse para representar un post de un blog:
import datetime post = {"author": "Mike", "text": "My first blog
post!", "tags": ["mongodb", "python", "pymongo"], "date":
datetime.datetime.utcnow()} 5. Para insertar datos en MondoDB
usamos el mtodo insert posts = db.posts post_id =
posts.insert(post) post_id 6. Podemos recuperar el listado de
colecciones con el comando: db.collection_names() 7. Para recuperar
un solo documento usamos find_one() posts.find_one() PyMongo:
Python y MongoDB 108. 108 8. El mtodo find_one()tambin permite
seleccionar elementos especficos que cumplen un filtro, ej.
documentos cuyo autor es Mike posts.find_one({"author": "Mike"}) 9.
Tambin podemos encontrar un post por _id que en nuestro ejemplo es
de tipo ObjectId. posts.find_one({"_id": post_id}) post_id_as_str =
str(post_id) posts.find_one({"_id": post_id_as_str}) # No result
10. Tambin se permiten inserciones en bloque con bulk inserts:
new_posts = [{"author": "Mike", "text": "Another post!", "tags":
["bulk", "insert"], "date": datetime.datetime(2009, 11, 12, 11,
14)}, {"author": "Eliot", "title": "MongoDB is fun", "text": "and
pretty easy too!", "date": datetime.datetime(2009, 11, 10, 10,
45)}] posts.insert(new_posts) PyMongo: Python y MongoDB 109. 109
11. Consultando ms de un documento puede hacerse del siguiente
modo: for post in posts.find(): post for post in
posts.find({"author": "Mike"}): post 11. Contando los posts:
posts.count() posts.find({"author": "Mike"}).count() 11. Consultas
de rangos: d = datetime.datetime(2009, 11, 12, 12) for post in
posts.find({"date": {"$lt": d}}).sort("author"): print post 11.
Indexacin: posts.find({"date": {"$lt":
d}}).sort("author").explain()["cursor"] posts.find({"date": {"$lt":
d}}).sort("author").explain()["nscanned"] 11. Creamos un ndice
compuesto para reducir la bsqueda: from pymongo import ASCENDING,
DESCENDING posts.create_index([("date", DESCENDING), ("author",
ASCENDING)]) posts.find({"date": {"$lt":
d}}).sort("author").explain()["cursor"] posts.find({"date": {"$lt":
d}}).sort("author").explain()["nscanned"] # Ahora la consulta est
usando un BtreeCursor y slo escanea los dos documentos encontrados
PyMongo: Python y MongoDB 110. 110 PyMongo: Python y MongoDB 111.
111 El uso de GridFS desde Python est documentado en:
http://api.mongodb.org/python/current/examples/gridfs.html Hay que
hacer uso del paquete gridfs, del objeto GridFS y sus mtodos:
import gridfs fs = gridfs.GridFS(db) # crea un nuevo fichero y
devuelve el _id del fichero creado b = fs.put(fs.get(a),
filename="foo", bar="baz" # get devuelve un fichero out = fs.get(b)
out.read() GridFS con PyMongo 112. 112 Node.js: Server-side
JavaScript La mayora de nosotros ha usado JavaScript como un
mecanismo para aadir interactividad a las pginas web Con la
aparicin de jQuery, Prototype y otros nos hemos dado cuenta que es
un lenguaje que sirve para algo ms que hacer un window.open() Sin
embargo, todas estas innovaciones eran para JavaScript como
lenguaje en la parte cliente Node.js nace para permitir usar
JavaScript tambin en la parte servidora Sin embargo, tu enfoque de
desarrollo tiene que cambiar radicalmente Va a estar basado en un
enfoque asncrono guiado por eventos URL: http://nodejs.org/ 113.
113 Full-Stack JavaScript Todos los navegadores (Opera, Chrome,
Firefox, Iexplorer) pelean por incorporar las ltimas capacidades de
HTML5 La combinacin HTML5+JavaScript se est configurando como la
plataforma de aplicaciones web para el front-end e incluso back-end
Con JavaScript se puede ya programar tanto la parte cliente que se
ejecuta en el navegador como la parte servidora alojada en el
servidor Web con frameworks como Node.js o motores de BBDD NoSQL
como MongoDB 114. 114 Mean.io MEAN is a fullstack javascript
platform for modern web applications MongoDB is the leading NoSQL
database, empowering businesses to be more agile and scalable.
Express is a minimal and flexible node.js web application
framework, providing a robust set of features for building single
and multi-page, and hybrid web applications. AngularJS lets you
extend HTML vocabulary for your application. The resulting
environment is extraordinarily expressive, readable, and quick to
develop. Node.js is a platform built on Chrome's JavaScript runtime
for easily building fast, scalable network applications. URL:
http://www.mean.io/ 115. 115 Mean.io 116. 116 Node.js sirve para
escribir en JavaScript programas en la parte servidora usando un
enfoque orientado a eventos La instalacin del driver oficial
Node.js para MongoDB se realiza con el siguiente comando: npm
install mongodb El soporte de node.js en MongoDB aparece detallado
en: http://docs.mongodb.org/ecosystem/drivers/node-js/ Tutorial:
http://mongodb.github.io/node-mongodb-native/api-
articles/nodekoarticle1.html MongoDB y node.js 117. 117 Ejemplo
sencillo de cdigo en node.js con driver nativo MongoDB: // Retrieve
var MongoClient = require('mongodb').MongoClient; // Connect to the
db MongoClient.connect("mongodb://localhost:27017/exampleDb",
function(err, db) { if(err) { return console.dir(err); } var
collection = db.collection('test'); var docs = [{mykey:1},
{mykey:2}, {mykey:3}]; collection.insert(docs, {w:1}, function(err,
result) { collection.find().toArray(function(err, items) {}); var
stream = collection.find({mykey:{$ne:2}}).stream();
stream.on("data", function(item) {}); stream.on("end", function()
{}); collection.findOne({mykey:1}, function(err, item) {}); }); });
Documentacin:
http://mongodb.github.io/node-mongodb-native/api-articles/nodekoarticle1.html
https://github.com/christkv/node-mongodb-native MongoDB y node.js
118. 118 Desplegando Node.js en Heroku Documentation in:
https://devcenter.heroku.com/articles/nodejs#visit-your-
application Signup in heroku:
https://api.heroku.com/signup/devcenter Install heroku toolbelt:
https://toolbelt.heroku.com/ This ensures that you have access to
the Heroku command-line client, Foreman, and the Git revision
control system. Type in: heroku login Create file web.js: var
express = require('express'); var app =
express.createServer(express.logger()); app.get('/',
function(request, response) { response.send('Hello World!'); });
var port = process.env.PORT || 5000; app.listen(port, function() {
console.log("Listening on " + port); }); 119. 119 Declare
dependencies for npm with package.json: { "name":
"arab2romanconversor", "version": "0.0.1", "dependencies": {
"express": "3.x", "mongodb": "1.4" }, "engines": { "node":
"0.10.x", "npm": "1.3.x" } } Use npm to install your dependencies:
npm install Create a Procfile for the sample app weve been working
on: web: node web.js You can now start your application locally
using Foreman (): foreman start Use git to create a local
repository: git init git add . git commit -m "init Deploy your
application to Heroku heroku create heroku addons:add mongohq
heroku config:get MONGOHQ_URL git push heroku master Visit your
application heroku ps:scale web=1 heroku open Desplegando Node.js
en Heroku 120. 120 Full-Stack JS Mobile Web App Conversor de nmeros
romanos a rabes Interfaz HTML5/CSS generada con jQueryMobile Codiqa
Parte servidora realizada con Node.js Conversin en aplicacin mvil
con la ayuda de PhoneGap Build https://build.phonegap.com/ 121. 121
MapReduce en Mongo y Cloud Computing MongoDB y Hadoop son una
combinacin poderosa y pueden ser utilizados para realizar tareas de
anlisis y procesado de datos almacenados en MondoDB MongoDB
Connector for Hadoop
http://docs.mongodb.org/ecosystem/tools/hadoop/ Casos de uso:
Agregacin batch, data warehouse y datos ETL MongoDB as a Service:
http://tour.mongohq.com/ BigData y MongoDB:
http://www.mongodb.com/learn/big-data 122. 122 The Emerging Big
Data Stack 123. 123 Comparacin MongoDB y CouchDB 124. 124 Ejemplos
de Consulta Buenos ejemplos de datos y consultas en MongoDB:
http://www.w3resource.com/mongodb/introducti on-mongodb.php MongoDB
CheatSheet: https://blog.codecentric.de/files/2012/12/Mongo
DB-CheatSheet-v1_0.pdf 125. 125 Conclusin MongoDB es una gran opcin
para remplazar a las bases de datos relacionales tradicionales en
nuevas aplicaciones o optimizando partes de los modelos de datos de
aplicaciones existentes. Las BBDD NoSQL son una clara alternativa a
los RDBMS Sobre todo para algunas aplicaciones sociales y web que
requieren elevada escalabilidad No son idneas para todo, de hecho
en la mayora de los casos las RDBMS deberan seguir siendo la
primera opcin: La capacidad de hacer JOIN y las garantas ACID son
muy importantes para muchas aplicaciones Es muy posible que los
RDBMS actuales evolucionen para incorporar capacidades de NoSQL
126. 126 Referencias MongoDB official site: http://www.mongodb.org/
Using the mongo Shell http://docs.mongodb.org/v2.2/mongo/ Mongo
Shell Quick Reference:
http://docs.mongodb.org/v2.2/reference/mongo- shell/ MongoDB: First
Contact by Thomas Jaspers
https://blog.codecentric.de/en/2012/11/mongodb- first-contact/ 127.
127 Referencias Aggregation
http://docs.mongodb.org/manual/aggregation/ Deploy a Replica Set
for Testing and Development
http://docs.mongodb.org/manual/tutorial/deploy-
replica-set-for-testing/ Convert a Replica Set to a Replicated
Sharded Cluster http://docs.mongodb.org/manual/tutorial/convert-
replica-set-to-replicated-shard-cluster/ 128. 128 Referencias The
Little MongoDB Book by Karl Seguin
http://openmymind.net/2011/3/28/The-Little- MongoDB-Book/ MongoDB:
First Contact, serie dar artculos por Thomas Jaspers:
https://blog.codecentric.de/en/2012/11/mongod b-first-contact/ 129.
129 MongoDB: la BBDD NoSQL ms popular del mercado 21 Mayo de 2014,
9:00-14:00 Parque Tecnolgico de Zamudio. Edificio Tecnalia, #204,
Bizkaia Dr. Diego Lpez-de-Ipia Gonzlez-de-Artaza [email protected]
http://paginaspersonales.deusto.es/dipina
http://www.slideshare.net/dipina Apuntes + Ejemplos + Docs +
Downloads disponibles en:
https://www.dropbox.com/sh/yz51jkr9y6t3c51/iXm679-WvJ/MongoDB