Você está na página 1de 6

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 = m.getDB(test); //nos retorna la base de datos con todas las colecciones
almacenadas en esta
DBCollection col=db.getCollection(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
student.put(name, rstname0, lastname0);
student.put(age, 20);
student.put(birthplace, acapulco, MX);
student.put(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();
father.put(name, rstname1, lastname1);
father.put(age, 46);
father.put(birthplace, hong kong, CN);
father.put(ID, 91235);
//se crea el objeto mother con sus respectivos datos
BasicDBObject mother = new BasicDBObject();
mother.put(name, rstname2, lastname2);
mother.put(age, 37);
mother.put(birthplace, Hanoi, VN);
/*
* por defecto al insertar un numero intentara insertarlo como integer
* para insertar un long se puede utilizar la sigiente sintaxis.
*/
mother.put(ID, new Long(062850957521));
//se agregan mother y father al objeto parents
parents.put(father, father);
parents.put(mother, mother);
//se agrega parents al objeto student
student.put(parents, parents);
//se inserta el estudiante a la coleccion
col.insert(student);
//imprimimos los datos recorriendo la base de datos utilizando un cursor
DBCursor cur = col.find();
while(cur.hasNext()) {
System.out.println(cur.next());
}

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
query.put(parents.father.ID, 91235);
//realizamos la busqueda
cur =col.find(query);
//imprimimos el resultado
while(cur.hasNext()) {
System.out.println(cur.next());
}

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();
query2.put(age,new BasicDBObject($gt, 20));
cur=col.find(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();
morphia.map(Student.class).map(Parents.class).map(Mother.class).map(Father.class);
//se le asigna a un datastore la coneccion a una base de datos en particular
Datastore ds = morphia.createDatastore(mongo, test);

Nota: Las clases Student.class, Parents.class, Mother.class, y Father.class


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
father.setName(rstname1, lastname1);
father.setAge(46);
father.setBirthplace(hong kong, CN);
father.setID(new Long(91235));
//se setean los datos de mother
mother.setName(rstname2, lastname2);
mother.setAge(37);
mother.setBirthplace(Hanoi, VN);
mother.setID(new Long(062850957521));
//se setean los datos de parets
parents.setFather(father);
parents.setMother(mother);
//se setean los datos de student
student.setName(rstname0, lastname0);

student.setAge(20);
student.setBirthplace(acapulco, MX);
student.setID(new Long(6782499));
student.setParents(parents);
//se guarda la informacion de student en la base de datos
ds.save(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 = ds.createQuery(Student.class).field(parents.father.ID).equal(91235);
//se hace el casting a Student y tenemos nalmente nuestro objeto
Student st = (Student) q.get();

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=ds.createQuery(Student.class).filter(age >=, 10).filter(
age <=, 30);
//retorna un listado de objetos tipo Student
List <Student> list=q1.asList();

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.

Você também pode gostar