TALLER NOSQL - MONGODB EN JAVA
Autor: Miguel Alexander Chitiva Diaz
July 8, 2012
Driver para java prove por mongodb
do
1. Descargar el driver para java dese la pagina ocial y agregarlo a un nuevo
proyecto de java.
2. Cree una clase que ser la encargada de realizar la conexin con la base
a
o
de datos, que contenga la siguiente informacin:
o
Mongo m = new Mongo(localhost, 27017);
DB db = [Link](test); //nos retorna la base de datos con todas las colecciones
almacenadas en esta
DBCollection col=[Link](collection name); //retorna unicamente la
coleccion que necesitamos
Nota: Se debe reemplazar la direccin y el puerto donde se encuentra
o
la base de datos; es una buena practica que dicho cdigo est dentro de
o
e
un patrn Singleton y que tanto la direccin y el puerto sean cargados
o
o
de archivos externos (generalmente .properties) para no caer en malas
practicas como Hard Coding.
3. Ahora veamos como se insertan datos, teniendo en cuenta el siguiente
JSON:
{
name:"firstname0, lastname0",
age:20,
birthplace:"acapulco, MX",
ID:6782499
parents:{
father:{
name:"firstname1, lastname1",
age:46,
birthplace:"hong kong, CN",
ID:91235
}
mother:{
name:"firstname2, lastname2",
age:37,
birthplace:"Hanoi, VN",
ID:062850957521"
}
1
}
}
//se crea el objeto student
BasicDBObject student = new BasicDBObject();
//se ponen los datos correspondientes
[Link](name, rstname0, lastname0);
[Link](age, 20);
[Link](birthplace, acapulco, MX);
[Link](ID, 6782499);
//se crea el objeto parents que contendra a su vez a father y mother
BasicDBObject parents = new BasicDBObject();
//se crea el objeto father con sus respectivos datos
BasicDBObject father = new BasicDBObject();
[Link](name, rstname1, lastname1);
[Link](age, 46);
[Link](birthplace, hong kong, CN);
[Link](ID, 91235);
//se crea el objeto mother con sus respectivos datos
BasicDBObject mother = new BasicDBObject();
[Link](name, rstname2, lastname2);
[Link](age, 37);
[Link](birthplace, Hanoi, VN);
/*
* por defecto al insertar un numero intentara insertarlo como integer
* para insertar un long se puede utilizar la sigiente sintaxis.
*/
[Link](ID, new Long(062850957521));
//se agregan mother y father al objeto parents
[Link](father, father);
[Link](mother, mother);
//se agrega parents al objeto student
[Link](parents, parents);
//se inserta el estudiante a la coleccion
[Link](student);
//imprimimos los datos recorriendo la base de datos utilizando un cursor
DBCursor cur = [Link]();
while([Link]()) {
[Link]([Link]());
}
Teniendo en cuenta la anterior informacin cree clases tipo entities,
o
utilizando herencia, agregacin o composicin y una clase tipo DAO
o
o
que realice la insercin de objetos student en la coleccin que se utilizo
o
o
anteriormente.
Inserte 200 objetos tipo student todos ellos con distintos valores, y
50 con exactamente los mismos valores utilizando para ello el DAO.
4. Supongamos que deseamos buscar dentro de la base de datos, segn el ID
u
de uno de los parientes, para tal n utilizamos la siguiente sintaxis.
BasicDBObject query = new BasicDBObject();
//el operador punto nos da la posibilidad de acceder a los 'campos' internos
[Link]([Link], 91235);
//realizamos la busqueda
cur =[Link](query);
//imprimimos el resultado
while([Link]()) {
[Link]([Link]());
}
Pero es comn al hacer una bsqueda, en que no busquemos un valor
u
u
exacto sino un rango, para ello utilizaremos los condicionales que provee
mongo resumidos en siguiente tabla:
Operador Lgico
o
<
<=
>
>=
!=
Operador en Mongo
$lt
$lte
$gt
$gte
$ne
Signicado Literal
lesser than
lesser than and equal
greater than
greather than and equal
not equal
para utilizarlos en una bsqueda, basta con colocar el campo en el cual
u
deseamos realizar la bsqueda, y en un objeto embebido el criterio de la
u
bsqueda de la siguiente forma:
u
BasicDBObject query2 = new BasicDBObject();
[Link](age,new BasicDBObject($gt, 20));
cur=[Link](query2);
//la anterior consulta retorna todos los objetos de tipo student que poseen una
edad mayor a 20
Basados en la anterior informacin dentro de la clase DAO realizada en el
o
punto anterior cree un mtodo que sea capaz de ltrar a todos los student
e
de la siguiente forma:
Student que tengan en su campo age superior a 15.
Father tenga en el campo age mayor a 45.
Mother no supere 40.
Dicha lista debe ser organizada de tal forma que el menor de todos
los student que cumpla las anteriores condiciones est de primeras y
e
el mayor de ultimas y que a su vez estn organizados por el campo
e
birthplace en orden lexicogrco descendente (Z de primeras, A ultia
mas); y como ultimo criterio que father este de menor a mayor.
Usando como alternativa Morphia
1. Descargar morphia desde la pagina del proyecto, e importarla dentro de un
nuevo proyecto de java, tambin se debe importar la librer de mongodb.
e
a
2. Cree una clase encargada de realizar la conexin, esta es muy similar a la
o
anterior salvo unas pequeas diferencias.
n
//se crea la conexion
Mongo mongo = new Mongo(localhost, 27017);
//se crea una instancia de morphia y se mapean las clases que necesitamos
Morphia morphia = new Morphia();
[Link]([Link]).map([Link]).map([Link]).map([Link]);
//se le asigna a un datastore la coneccion a una base de datos en particular
Datastore ds = [Link](mongo, test);
Nota: Las clases [Link], [Link], [Link], y [Link]
se crearan mas adelante.
3. Cree una paquete denominado entity, dentro de este cree las clases Student, Parents, Mother y Father, con sus respectivos getters y setters, la
estructura general deber verse algo como lo siguiente.
a
3
/* clase Student */
//etiquetas '@' todas son etiquetas de morphia.
@Entity
public class Student {
//la etiqueta id, es la encargada de manejar el id interno de mongo, y es de tipo
ObjectId (BSON)
@Id
private ObjectId id;
//atributos corrientes del estudiante
private String name;
private int age;
private String birthplace;
private Long ID;
//delimita a el campo parents como un campo embebido dentro de student
@Embedded
private Parents parents;
//getters y setters
}
/* clase Father */
@Entity
public class Father {
@Id
private ObjectId id;
private String name;
private int age;
private String birthplace;
private Long ID;
//getters y setters
}
/* clase Parents */
@Entity
public class Parents {
@Id
private ObjectId id;
@Embedded
private Mother mother;
@Embedded
private Father father;
//getters y setters
}
4. Para asignar los valores necesarios, basta utilizar los setters que existen en
cada una de las clases, y posteriormente se realiza la insercin del nuevo
o
objeto student.
//se crean instancias de las clases
Student student=new Student();
Parents parents=new Parents();
Father father=new Father();
Mother mother=new Mother();
//se setean los datos de father
[Link](rstname1, lastname1);
[Link](46);
[Link](hong kong, CN);
[Link](new Long(91235));
//se setean los datos de mother
[Link](rstname2, lastname2);
[Link](37);
[Link](Hanoi, VN);
[Link](new Long(062850957521));
//se setean los datos de parets
[Link](father);
[Link](mother);
//se setean los datos de student
[Link](rstname0, lastname0);
[Link](20);
[Link](acapulco, MX);
[Link](new Long(6782499));
[Link](parents);
//se guarda la informacion de student en la base de datos
[Link](student);
Construir un objeto tipo DAO y con este inserte 200 objetos tipo
student todos ellos con distintos valores, y 50 con exactamente los
mismos valores.
5. Ahora vamos a realizar la misma bsqueda de la primera parte. Se ver
u
a
algo as
.
//se crea un objeto tipo query perteneciente a morphia, a este se le debe pasar como
parametro
//el objeto que espera (recordemos que morphia utiliza los objetos y no el nombre
de la coleccion)
Query q = [Link]([Link]).field([Link]).equal(91235);
//se hace el casting a Student y tenemos nalmente nuestro objeto
Student st = (Student) [Link]();
El cdigo anterior funciona si se busca tan solo el primer elemento (equivo
alente a ndOne() de mongodb).
Si deseamos realizar una consulta por rango lucir algo as
a
:
//se puede hacer concatenacion de consultas, sin necesidad de aprenderse la
sintaxis para mongo
Query <Student> q1=[Link]([Link]).filter(age >=, 10).filter(
age <=, 30);
//retorna un listado de objetos tipo Student
List <Student> list=[Link]();
Basados en la anterior informacin dentro de la clase DAO realizada en el
o
punto anterior cree un mtodo que sea capaz de ltrar a todos los student
e
de la siguiente forma:
Student que tengan en su campo age superior a 15.
Father tenga en el campo age mayor a 45.
Mother no supere 40.
Dicha lista debe ser organizada de tal forma que el menor de todos
los student que cumpla las anteriores condiciones est de primeras y
e
el mayor de ultimas y que a su vez estn organizados por el campo
e
birthplace en orden lexicogrco descendente (Z de primeras, A ultia
mas); y como ultimo criterio que father este de menor a mayor.
Entregables
1. Realizar un informe en formato pdf, donde muestre los resultados (pantallasos) de todas inserciones y consultas; tanto en la consola de java como
en la de mongo.
2. Muestre y explique las diferencias (si las hay) entre el JSON de muestra,
y las impresiones de ambas consolas.
5
3. Explique las ventajas y desventajas que tienen ambos mtodos de conexin
e
o
entre mongodb y java. Cual mtodo utilizar usted para su proyecto y
e
a
por qu?
e
4. En un archivo comprimido, adjunte ambos proyectos de java junto con el
informe.