jueves, 15 de febrero de 2018

Java y MongoDB

Vamos a ver qué fácil trabajar con Java y Mongo. Para nuestro ejemplo vamos a usar una base de datos desarrollada en MLab (pueden usar este documento para ver cómo funciona). Para poder trabajar con los documentos vamos a crear objetos en Java de tipo POJO y luego estos los podemos guardar en nuestra base de datos.

Primero vamos hacer una pequeña aplicación en Java. Esta le vamos a llamar Agenda.

Para que el proyecto funcione vamos a requerir agregar dos librerias a nuestro projecto. La primera es mongo-java-drive-3.4.2.jar y bson-3.5.0.jar


Cuando tenemos esto listo vamos a crear dos paquetes uno llamado Mongo y otro POJO. En el paquete de mongo vamos a tener el código y la configuración necesaria para conectarnos a nuestra base de datos. Mientras que en la de POJO solo una clase que nos permite almacenar la información que deseamos guardar.


Vamos a estudiar primero la clase mongoBase en esta clase tenemos la configuración básica para nuestro base de datos.

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import static com.mongodb.client.model.Filters.eq;
import org.bson.Document;

Como vemos lo primero que tenemos que hacer es importar las librerías que vemos de la línea anteriormente. 

private final MongoClientURI uri;
private final MongoClient mongoClient;
private final MongoDatabase database;
private final String collectionName;

Vamos a declarar 4 variables para la configuración básica de nuestro sistema.

uri: esta va a tener la dirección de nuestra base de datos

mongoClient: vamos a inicializarla con la dirección de nuestra base de datos

database: esta variable tiene el nombre de nuestra base de datos

collectionName: con esta variable guardamos el nombre de la colección para guardar nuestros datos.


public mongoBase(final String collectionName) {
        this.collectionName=collectionName;
        uri = new MongoClientURI("mongodb://<user>:<password>@ds123698.mlab.com:23698/agenda");
        mongoClient = new MongoClient(uri);
        database = mongoClient.getDatabase("agenda");
}

Ahora debemos inicializar las variables en el constructor. La primera es la dirección de la base de datos. Esta dirección la podemos encontrar en nuestra configuración en mLab.


public <T> void saveDocument(T objectToSave)
{
     MongoCollection collection =  database.getCollection(collectionName);
     collection.insertOne(getDocument(objectToSave));
}

Continuamos con el método saveDocument con el que vamos a poder guardar cualquier documento en nuestra base de datos. Por el momento solo vamos a guardar documentos de personas.

Vamos a inicializar una variable de tipo MongoCollection usando la colección que deseamos usar para almacenar los datos.

Ahora vamos a usar la variable collection que acabamos de hacer y utilizando el método insertOne vamos a guardar nuestra información.


protected abstract <T> Document getDocument(T objectToSave);

Para crear el documento que deseamos guardar en nuestra base de datos de mongo debemos utilizar el método getDocument. Este método se debe sobrescribir.


Ahora vamos a la clase AgendaController en esta clase vamos a especializar la clase base de mongo para poder manejar nuestros objetos de tipo Person.


public AgendaController() {
   super("AgendaCollection");
}
En el constructor de la clase le vamos a pasar el nombre de nuestra colección para que se establezca de manera global en nuestra clase base mongoBase.


@Override
public <T> Document getDocument(T objectToSave) {
     Person contact = (Person) objectToSave;

     Document doc = new Document("name", contact.getName())
                .append("phone", contact.getPhone())
                .append("email", contact.getEmail())
                .append("lastName", contact.getLastName())
                .append("cellPhone", contact.getCellPhone());
     return doc;
}
Debemos a sobreescribir el método getDocument de la clase base. Este método va a crear los documentos de tipo Person que vamos a guardar en nuestra base de datos. Como vemos en el método se pasa por parámetro el objeto que deseamos guardar.

Luego lo convertimos a un objeto de tipo Person y luego extraemos la información de sus variables. Con la variable doc que es de tipo Document vamos a crear nuestro documento para guardarlo en la base de datos. Como vemos agregamos cada una de las propiedades al documento cuando este esta listo con un return enviamos el documento listo.


public List<Document> getDocuments(final String name, final String lastName) {
    MongoCollection<Document> collection = super.getDatabase().getCollection("AgendaCollection");

    List<BasicDBObject> obj = new ArrayList<BasicDBObject>();

    obj.add(new BasicDBObject("name", name));
    obj.add(new BasicDBObject("lastName", lastName));
    BasicDBObject whereQuery = new BasicDBObject();
    whereQuery.put("$and", obj);
    List<Document> documents = collection.find(whereQuery).into(new ArrayList<Document>());
    return documents;
}
En esta clase también tenemos el método getDocuments que nos permite hacer búsquedas en nuestra base de datos de mongo. Nuestro método va hacer búsquedas usando el nombre y apellido de la persona.

Para hacer la búsqueda vamos hacer una referencia de la colección donde se encuentran nuestros datos. Esto lo hacemos con la variable collection.

Luego vamos a tener una lista de tipo BasicDBObject que llamamos obj. En este objeto vamos a agregar los filtros para buscar nuestros datos. Cuando agregamos todos los datos que queremos usar para filtrar creamos una variable que llamamos whereQuery que también es un BasicDBObject en vamos agregar la función “and” y la lista con los criterios de búsqueda.

Ahora llamando el método find de la variable collection vamos a ejecutar la búsqueda. En el método find agregamos la variable whereQuery que ya preparamos con todo lo necesario para buscar documentos. Los resultados serán almacenados en la varible List para poder hacer lo que sea con ellos.

Finalmente, en el main creamos un objeto nuevo de tipo Person y luego creamos un objeto de tipo AgendaController con nombre agenda. Hacemos llamado al método saveDocument y le pasamos el objeto person para que sean guardados en la base de datos. Ahora ejecutamos el método getDocument y le pasamos el nombre de la persona que creamos para ver si se guardo en la base de datos. 

Ejemplo completo

Etiquetas: , ,

0 comentarios:

Publicar un comentario

Suscribirse a Enviar comentarios [Atom]

<< Inicio