mongodb: la bbdd nosql más popular del mercado

129
1 MongoDB: la BBDD NoSQL más popular del mercado 21 Mayo de 2014, 9:00-14:00 Parque Tecnológico de Zamudio. Edificio Tecnalia, #204, Bizkaia Dr. Diego López-de-Ipiña González-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

Upload: diego-lopez-de-ipina-gonzalez-de-artaza

Post on 21-May-2015

4.357 views

Category:

Technology


2 download

DESCRIPTION

Introducción a las bases de datos NoSQL Concepto y campos relacionados Principales características Arquitectura de las bases de datos NoSQL Taxonomía de soluciones NoSQL Empresas que usan bases de datos NoSQL MongoDB: una BBDD NoSQL orientada a Documentos Introducción: características y arquitectura Instalación sobre diferentes sistemas operativos Utilidades de mongoDB: mongo, mongostat, mongotop, etc. Características principales: Consultas Ad hoc Indexación Replicación Balanceo de carga Almacenamiento de archivos Agregación Programación en MongoDB Ejecución de JavaScript del lado del servidor Programación de MongoDB desde Java y Python Desarrollo de una aplicación avanzada con MongoDB Conclusiones Otras alternativas destacables: CouchDB Aplicabilidad a mi empresa

TRANSCRIPT

  • 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