Buenos días. En esta secuencia os hablaré de
Voyage un wrapper para bases de datos NoSQL.
Veremos un poco que es Voyage.
Aqui, el objetivo és el de poder crear una verdadera aplicación.
Tiny blog, la podréis guardar con Voyage en
una base de datos Mongo y instalarla en un verdadero servidor.
La idea, es de enseñarle también como
guardar objetos fácilmente, y hemos elegido esta
solución porque es realmente muy sencilla para el curso.
MongoDB, de que se trata?
MongoDB, son las nuevas bases de datos NoSQL que
estan orientadas a documentos. Usted dispone de un lenguaje
de consultas incorporado y es una de las más populares.
También, tiene Couch DB y Riak.
De momento, utilizaremos MongoDB y Voyage.
Que es Voyage?
Voyage, es un replicador que
tomará los objets y los replicará en MongoDB esto lo
hará casi automáticamente para usted.
Para aquellos que hayan trabajado con Java en hibernate, Voyage, és
el equivalente de hibernate para MongoDB y claro, esta realizado para Pharo.
Cuales son las funcionalidades de Voyage?
De hecho, Voyage es muy simple, nos va a garantizar la identidad de
de nuestros objetos cuando se guarden en la base de datos y los recargue.
Ofrece capacidades para gestionar Errores.
También dispone de un pool de conexión para que ello
funcione más rápido.
Para empezar y enseñaros, la primera cosa que haremos
es crear un repositorio Mongo
con esta expresión.
Aquí, és si usted quier acceder a su base de datos Mongo
Que esta gestiona de modo externo a Pharo.
Ahora lo que hacemos a menudo es trabajar en modo
prototipo, y utilizaremos una base de datos Mongo en memoria.
A visto la diferencia, aquí se encuentra Mongo memory repository.
La idea, es que no necesita una base de datos Mongo,
usted podrá simular su aplicación.
Y cuando finalmente funcione, entonces podrá cambiar
el repositorio en memoria por un repositorio verdadero y
trabajar con su base exterior, esta és una buena practica a utilizar.
Para ilustra Mongo, construiremos un modelo
objeto que se compone de super-heroes con super-poderes, con armaduras.
Tendrá un ejercicio, lo podrá hacer de todas maneras,
todo lo que le mostraré durante este curso, dispondrá
del soporte para poder realizarlo.
Y le sugiero de hacerlo porque es divertido de codear Superman.
Miraremos como funciona Heroes y super poderes.
Simplificando, tenemos una clase Héros.
Tiene un nombre, un nivel y luego tiene unos poderes.
El nombre, tengo un accesor con el nombre.
Tengo un setter para introducir el nombre.
Tengo un nivel parecido aquí.
Y los poderes, los gestiono de manera conjunta.
Así aquí, digo los poderes, al inicio si es vacío pongo
un conjunto, y cuando pueda incorporo un poder, esto
añade un poder al conjunto.
Así pues, realmente muy simple.
Y los poderes, de que se trata?
De momento, nuestro poder tiene simplemente un nombre que
podemos poner o no.
De Momento, el punto está en como lo hago para declarar
que las clases de mi dominio se guardan en la base?
Aquí tenemos el concepto de root class, cuales son los puntos de entrada
que tendremos en nuestra base de datos?
Esto puede ser cualquier clase del sistema.
Como declararemos esto?
Lo declararemos con un método de clase, insisto
en la clase, un método de clase que se llama isVoyageRoot.
como hacemos para los heroes?
Es super fácil, haremos clase heroe isVoyage devuelve verdadero.
A partir de este momento, Voyage sabe que puedo
guardar mis heroes en la base de datos Mongo.
Si hacemos Spiderman, Spiderman se llama Spiderman,
es de nivel épico, tiene como super poder una
super fuerza, también puede escalar los muros y ademas
dispone de un instinto de araña.
Luego tenemos otro.
Aquí veis, lo guardo, save, esto muestra a Voyage "OK,
tomas un super heroe y lo guardas en tu base.
Y de la misma manera con Wolverine, habéis comprendido
que tiene otras propiedades y lo mismo, puedo guardar.
Luego si miro a mi base de datos Mongo, si hago DB
Hero encuentra 0, que és lo que veo?
Veo a mi heroe Spiderman y que tiene?
Aquí justamente se tiene que prestar atención, vemos claramente
que tiene su super poder que esta perfectamente descrito
aquí. Tendrías lo mismo con Wolverine, y ect...
De acuerdo?
Una vez que hacemos esto al nivel de Pharo, podemos hacer
un montón de expresiones. No entraré en los detalles
pero puedo seleccionar a todos los puer héroes.
Aquí, tendré Spiderman y Wolverine.
Puedo decir que quiero encontrar los héroes que se llaman Spiderman.
Aquí, puedo decir que quiero encontrar a todos los super
héroes que tienen un nivel épico.
Aquí, encontrare mis 2 super héroes.
Ahora, me expresaré de forma diferente porque de hecho,
la base de datos mongo comprende Json, así puedo crear json
al vuelo y inyectarlo y realizar una consulta a la base de json.
Aquí, me gustaría conoces al super héroe cuyo nombre
es Spiderman pero podéis ver que lo he expresado bajo la forma
de Json, y escribiendo as directory me devuelve un diccionario.
Puedo hacer lo mismo para select as many.
Esto dependerá de las consulta, hay consultas mas fáciles de
expresar de esta forma que de la otra,
pero para usted y ahora no tiene más importancia.
También podemos realizar consultas que son mucho más avanzadas.
Puedo decir "Quiero seleccionar la mayoría de
super héroes que tienen un nivel épico, cuyo nombre se
ordena de forma ascendente y lo quiero limitar a 10,
y quiero empezar en la página 0 para poder buscar
porciones en mi base de datos.
Esto, cuando lo necesite solo tiene que mirar en la documentación.
Podemos realizar otras operaciones encima.
Puedo contar el numero de héroes, lo que esta muy bien.
Luego, puedo contar aquellos que satisfacen cierta propiedad.
Por supuesto, puedo eliminar, entonces si aquí hace remove
all, no tendrá mas objetos en la base, se debe ser consciente.
Aquí, puedo decir "Voy a seleccionar uno y luego lo eliminare.
Y habría podido eliminar mi heroe de mi base de datos.
No es solo las operaciones que tienen sentido, digamos.
Ahora la cuestión que se plantea al fin cuando
utilice MongoDB, es lo que llamamos
una raíz de base, y cuando definimos una
clase como raíz de base?
Definimos una clase como raíz de base cuando
necesitamos realizar consultas.
Esta, es la primera regla; realizo una consulta porque
he definido mi clase como una raíz porque quiero poder
acceder a todos los objetos de esta clase.
El otro punto, es "Quiero compartir objetos entre
mis objetos" Así, aquí por ejemplo quiero compartir
poderes, porque la frase no es muy clara, quiero
compartir poderes entre mis héroes.
En este caso, debería poder definir "poderes" como
una raíz, así que vamos a ver esto.
Si miramos héroes, es realmente una raíz en nuestro
ejemplo, pero de hecho los poderes también podrían ser
una raíz, no hay problema.
En Voyage, podemos declarar cualquier clase como raíz.
Como lo hacemos?
Igual que antes, voy a decir que mi clase
power, es una raíz. Esto quiere decir que
creo el poder fly que quiere decir volar y que
lo guardo, se guardara en base; la fuerza sobrehumana, lo mismo.
Y ahora lo que voy a hacer, podre realizar una
consulta que me dirá "Quiero recuperar el poder
También quiero recuperar el poder de tener una fuerza sobrehumana.
"Y aquí ahora, vuelvo a crear Superman diciendo que
he recuperado estos 2 poderes, esto quiere decir que solo existe
uno en el sistema cada vez que guardo.
Que esta pasando a nivel de mi base?
Es importante, se debe realizar un reset para que todo
funcione bien. En general, cada vez que modifica el
el esquema de la base, es necesario de utilizar esta expresión.
Pero lo que me interesa aquí, de enseñarle es que
ahora en los poderes de Superman, ya no tengo el
poder que se ha descrito de manera compuesta en el interior.
pero tengo una referencia hacia un poder.
Y aqui, voy a tener otra referencia.
Así que, que quiere decir esto?
Esto quiere decir que si tengo otro super héroe que sabe
volar, podre compartir este poder en lugar de
tener 2. Y esto, esto depende de su dominio así que
en función del dominio y según como usted quiera modelizar
su dominio, tendrá que definir raíces diferentes.
Este, es sobre un ejemplo tonto pero solo era para facilitarle la intuición.
Si repito, tendrá que definir un dominio si usted
necesita hacer consultas o si quiere
compartir los objetos de esta raíz.
Como expresamos las relaciones en Voyage?
De hecho, és el equivalente a las llaves foráneas en las
bases de datos relacionales. Voyage gestionara
automáticamente las referencias cíclicas entres sus raíces.
Usted no tiene que hacer nada.
Por contra debe prestar atención, Voyage no gestiona
las referencias cíclicas entre objetos compuestos en su
interior. Usted debe experimentar y luego
vera que la mayoría de las veces cuando tiene raíces
usted no tiene ningún problema.
Lo que le quería enseñar en este curso, es que
podemos guardar muy fácilmente objetos en una base de datos Mongo.
Si usted quiere conocer mas, encontrara un capitulo
en el libro Enterprise Pharo, Web perspectives que se encuentra
en las fuentes del MOOC. De todas maneras tendrá un
pequeño tutorial que le acompañara
reconstruyendo los super héroes, así que lo podrá aprender todo.