Conectando una aplicación Java con MongoDB en Windows

MongoDB es un sistema de base de datos NoSQL orientado a documentos y de código abierto. MongoDB, a diferencia de MySQL que guarda los datos en tablas de bases de datos relaciones, guarda estructuras de datos en documentos tipo JSON con un esquema dinámico (cuyo formato es llamado BSON). Con MongoDB, la integración de datos en ciertas aplicaciones es más fácil y rápida.

Esta guía / tutorial para conectar y utilizar datos de MongoDB usando Java en Windows 7 (aunque creo que con Windows 8 también funcionaría). Las partes que lo componen son:

  1. Instalación de MongoDB.
    1. Descarga de MongoDB.
    2. Descomprime MongoDB.
    3. Configura variables de entorno.
    4. Crea el archivo de configuración.
    5. Crea las carpetas para datos y logs.
    6. Ejecuta el servidor de MongoDB.
    7. Probar a ejecutar MongoDB.
  2. Descarga del driver mongo-java.
  3. Creación de un proyecto simple en Java (con Eclipse).
    1. Estructura básica del proyecto Java.
    2. Añadiendo código para imprimir las bases de datos MongoDB.
    3. Añadiendo una nueva base de datos a MongoSQL y operaciones (ejemplo 1).
    4. Añadiendo una nueva base de datos a MongoSQL y operaciones (ejemplo 2).

.

1. Instalación de MongoDB.

1.1. Descarga de MongoDB.

En primer lugar, descarga e instala MongoDB: http://www.mongodb.org/downloads

mongodb1

Como puedes ver, puedes instalar MongoDB en Windows, Linux, Mac OS X y Solaris (en la misma web, tienes otros instaladores para otros sistemas, como FreeBSD, Debian, Gentoo, etc.). Debes de tener en cuenta si tu sistema operativo está a 32 o 64 bits.

MongoDB 2.4.8 para Windows 64 bits ocupa 101 MB comprimidos.

.

1.2. Descomprime MongoDB.

Una vez descargado, descomprime el archivo en, por ejemplo, c:\mongodb\ (crea antes la carpeta). Debe quedar un aspecto similar a éste:

mongodb2

.

1.3. Configura variables de entorno.

La carpeta bin contiene una serie de ejecutables, por lo que es conveniente añadir dicha carpeta en las variables de entorno de Windows. Para ello:

  • Click con el boton derecho sobre Mi PC / Propiedades.
  • Click en “Configuración avanzada del Sistema”
  • En la pestaña “Avanzado”, click en “Variables de Entorno”.
  • En “Variables del sistema”, en la variable “Path”, añade al final del valor “;c:\mongodb\bin\”.
  • Pulsa OK a esta ventana y a las otros.

mongodb3

.

1.4. Crea el archivo de configuración.

Crea un archivo con nombre “mongo.config” en c:\mongodb\ y en éste indica estos parámetros:

##store data here
dbpath=c:\mongodb\data

##all output go here
logpath=c:\mongodb\log\mongo.log

##log read and write operations
diaglog=3

.

1.5. Crea las carpetas para datos y logs.

Crea las carpetas “data” y “log” en “c:\mongodb\”.

En ellas se añadirán los datos de las bases de datos y los archivos logs respectivamente.

.

1.6. Ejecuta el servidor de MongoDB.

Para ejecutar el servidor de MongoDB tienes dos alternativas:

  1. Ejecutarlo en el shell de windows y dejar dicha ventana abierta todo el rato.
  2. Añadir al servidor de MongoDB como Servicio de Windows para que se inicie automáticamente cuando se arranque el sistema operativo.

La primera alternativa simplemente consiste en ejecutar “cmd.exe” (el command de Windows) e introducir el siguiente comando:

mongod –config c:\mongodb\mongo.config

Siempre que no cierres la ventana, podrás interactuar con MongoDB, ya que el servicio estará activo. El resultado será algo similar al de la imagen:

mongodb20

.

La segunda alternativa también es bastante simple, aunque en este caso se añade un nuevo servicio a Windows, y sería recomendable tenerlo parado (stop) cuando no estamos utilizándolo. Para ello, ejecuta “cmd.exe” (el command de Windows) pero en este caso como administrador (para ello, click con el botón derecho sobre “cmd.exe” y pulsa sobre “Ejecutar como administrador”) e introduce los siguientes comandos:

mongod --config c:\mongodb\mongo.config –install
net start MongoDB

mongodb21

El primer comando instala a MongoDB como un servicio de Windows, y el segundo comando inicia el servidor de MongoDB.

El resultado será algo similar al de la imagen:

mongodb22

.

Nota: Quizás en un futuro quieres detener o eliminar MongoDB como servicio de Windows. Para ello, aquí tienes estos comandos:

  • Para detener el servicio: net stop MongoDB
  • Para eliminar el servicio: mongod –remove

.

1.7. Probar a ejecutar MongoDB.

Asegúrate que instalaste y configuraste con éxito MongoDB. Para ello, ejecutar “cmd.exe” (el command de Windows) e introducir el siguiente comando:

mongo

Si todo salió con éxito, el resultado será algo similar al de la imagen:

mongodb23

.

2. Descarga del driver mongo-java.

Descárgalo desde aquí: https://github.com/mongodb/mongo-java-driver/downloads

El driver de Mongo en su versión 2.10.1 ocupa 389 KB.

Nota: Una excelente colección de drivers para MongoDB para multitud de lenguajes la tienes aquí: http://docs.mongodb.org/ecosystem/drivers/

Sugiero guardar el driver en una carpeta fácil de recordar. En mi caso, he creado en “c: \mongodb” la carpeta “drivers”, y ahí los voy guardando (c:\mongodb\drivers\).

.

3. Creación de un proyecto simple en Java (con Eclipse).

3.1. Estructura básica del proyecto Java.

La idea de esta guía es que sea lo más simple posible, por lo que realizaré un proyecto Java con Eclipse muy sencillo. Para ello:

  • Abre Eclipse.
  • Click en Archivo / Nuevo / Otros.
  • En la nueva ventana, click en Java / Java Project, y click en “Siguiente”.

mongodb10

  • Pon un nombre el proyecto, por ejemplo “mongo-project” (en mi caso ni me he complicado en la ubicación y lo crearé sobre wamp en c:\wamp\www\mongo-project), y click en “Siguiente”.

mongodb11

  • En la pestaña librerías, click en “Añadir JAR externo”, y agregamos el driver que habíamos descargado previamente, y click en “Finalizar”.

mongodb12

  • La estructura del proyecto será muy simple, tal y como se puede ver en la imagen.

mongodb13

.

3.2. Añadiendo código para imprimir las bases de datos MongoDB.

A continuación, añadir una nueva clase en nuestro proyecto Java en el que escribiremos el siguiente código. En dicho código, se crea una conexión para la base de datos y se hace un listado de las bases de datos:

import java.net.UnknownHostException;
import java.util.List;

import com.mongodb.MongoClient;

/**
 * Prueba para realizar conexión con MongoDB.
 * @author j
 *
 */
public class prueba {
	/**
	 * Main del proyecto.
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("Prueba conexión MongoDB");
		MongoClient mongo = crearConexion();

		if (mongo != null) {
			System.out.println("Lista de bases de datos: ");
			printDatabases(mongo);

		} else {
			System.out.println("Error: Conexión no establecida");
		}
	}

	/**
	 * Clase para crear una conexión a MongoDB.
	 * @return MongoClient conexión
	 */
	private static MongoClient crearConexion() {
		MongoClient mongo = null;
		try {
			mongo = new MongoClient("localhost", 27017);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}

		return mongo;
	}

	/**
	 * Clase que imprime por pantalla todas las bases de datos MongoDB.
	 * @param mongo conexión a MongoDB
	 */
	private static void printDatabases(MongoClient mongo) {
		List dbs = mongo.getDatabaseNames();
		for (String db : dbs) {
			System.out.println(" - " + db);
		}
	}
}

.

El resultado será algo similar a éste:

mongodb30

.

3.3. Añadiendo una nueva base de datos a MongoSQL y operaciones (ejemplo 1).

A continuación se añaden ciertas operaciones para hacer más fácil la visión de insert, update, select y delete archiconocido en MySQL. La sintaxis es aquí muy distinta, pero no por ello es más complicado.

En este ejemplo, el código se plasma solo en el main de una forma, llamémosle a lo bestia. Aun así, quizás así sea mucho más fácl para ser entendido por novatos:

import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.MongoClient;

/**
 * Prueba para realizar conexión con MongoDB.
 * @author j
 *
 */
public class prueba {
	/**
	 * Main del proyecto.
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("Prueba conexión MongoDB");
		MongoClient mongo = null;
		try {
			mongo = new MongoClient("localhost", 27017);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}

		if (mongo != null) {

			//Si no existe la base de datos la crea
			DB db = mongo.getDB("bd-ejemplo");

			//Crea una tabla si no existe y agrega datos
			DBCollection table = db.getCollection("trabajador");

			//Crea los objectos básicos
			BasicDBObject document1 = new BasicDBObject();
			document1.put("nombre", "Jose");
			document1.put("apellidos", "Lopez Perez");
			document1.put("anyos", 45);
			document1.put("fecha", new Date());

			BasicDBObject document2 = new BasicDBObject();
			document2.put("nombre", "Maria");
			document2.put("apellidos", "Martinez Aguilar");
			document2.put("anyos", 35);
			document2.put("fecha", new Date());

			BasicDBObject document3 = new BasicDBObject();
			document3.put("nombre", "Juan");
			document3.put("apellidos", "Navarro Robles");
			document3.put("anyos", 25);
			document3.put("fecha", new Date());

			BasicDBObject document4 = new BasicDBObject();
			document4.put("nombre", "Lucia");
			document4.put("apellidos", "Casas Meca");
			document4.put("anyos", 66);
			document4.put("fecha", new Date());

			BasicDBObject document5 = new BasicDBObject();
			document5.put("nombre", "Jose");
			document5.put("apellidos", "Naranjo Moreno");
			document5.put("anyos", 33);
			document5.put("fecha", new Date());

			BasicDBObject document6 = new BasicDBObject();
			document6.put("nombre", "Jose Luis");
			document6.put("apellidos", "Romero Diaz");
			document6.put("anyos", 55);
			document6.put("fecha", new Date());

			BasicDBObject document7 = new BasicDBObject();
			document7.put("nombre", "Ana");
			document7.put("apellidos", "Canovas Perez");
			document7.put("anyos", 24);
			document7.put("fecha", new Date());

			BasicDBObject document8 = new BasicDBObject();
			document8.put("nombre", "Lucia");
			document8.put("apellidos", "Martinez Martinez");
			document8.put("anyos", 67);
			document8.put("fecha", new Date());

			//Insertar tablas
			table.insert(document1);
			table.insert(document2);
			table.insert(document3);
			table.insert(document4);
			table.insert(document5);
			table.insert(document6);
			table.insert(document7);
			table.insert(document8);

			//Actualiza la edad de los trabajadores con el nombre "Jose"
			BasicDBObject updateAnyos = new BasicDBObject();
			updateAnyos.append("$set", new BasicDBObject().append("anyos", 46));

			BasicDBObject searchById = new BasicDBObject();
			searchById.append("nombre", "Jose");

			table.updateMulti(searchById, updateAnyos);

			//Listar la tabla "trabajador"
			System.out.println("Listar los registros de la tabla: ");
			DBCursor cur = table.find();
			while (cur.hasNext()) {
				System.out.println(" - " + cur.next().get("nombre") + " " + cur.curr().get("apellidos") + " -- " + cur.curr().get("anyos") + " años (" + cur.curr().get("fecha") + ")");
		    }
			System.out.println();

			//Listar de la tabla "trabajador" aquellos que se llamen "Jose"
			System.out.println("Listar los registros de la tabla cuyo nombre sea Jose: ");
			BasicDBObject query = new BasicDBObject();
			query.put("nombre", "Jose");

			DBCursor cur2 = table.find(query);
			while (cur2.hasNext()) {
				System.out.println(" - " + cur2.next().get("nombre") + " " + cur2.curr().get("apellidos") + " -- " + cur2.curr().get("anyos") + " años (" + cur2.curr().get("fecha") + ")");
			}
			System.out.println();

			//Eliminar los trabajadores cuyo nombre sean "Ana"
			table.remove(new BasicDBObject().append("nombre", "Ana"));

			//Eliminar los trabajadores cuyos anyos sean mayor que 50
			BasicDBObject query2 = new BasicDBObject();
			query2.put("anyos", new BasicDBObject("$gt", 65));
			table.remove(query2);

			//Eliminar los trabajadores con los apellidos abajo indicados en la lista
			List lista = new ArrayList();
			lista.add("Casas Meca");
			lista.add("Navarro Robles");
			BasicDBObject query3 = new BasicDBObject();
			query3.put("apellidos", new BasicDBObject("$in", lista));
			table.remove(query3);

			//Listar la tabla "trabajador" (otra vez)
			System.out.println("Listar los registros de la tabla: ");
			DBCursor cur3 = table.find();
			while (cur3.hasNext()) {
				System.out.println(" - " + cur3.next().get("nombre") + " " + cur3.curr().get("apellidos") + " -- " + cur3.curr().get("anyos") + " años (" + cur3.curr().get("fecha") + ")");
		    }
			System.out.println();

			//Listar las tablas de la base de datos actual
			System.out.println("Lista de tablas de la base de datos: ");
			Set tables = db.getCollectionNames();
			for(String coleccion : tables){
				System.out.println(" - " + coleccion);
			}
			System.out.println();

			//Listas las bases de datos
			System.out.println("Lista de todas las bases de datos: ");
			List basesDeDatos = mongo.getDatabaseNames();
			for (String nombreBaseDatos : basesDeDatos) {
				System.out.println(" - " + nombreBaseDatos);
			}
			System.out.println();

			//Borrar base de datos
            db.dropDatabase();

		} else {
			System.out.println("Error: Conexión no establecida");
		}
	}
}

.

3.4. Añadiendo una nueva base de datos a MongoSQL y operaciones (ejemplo 2).

Este ejemplo está totalmente basado en el anterior. De hecho, primero cree este código separado en funciones (aquí indicado) y a continuación el del punto 3.3. para darle una lectura más simple. No obstante, este código es muy mejorable, y el separarlo por funciones no lo hace ni más rápido ni más ligero que el anterior:

import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.MongoClient;

/**
 * Prueba para realizar conexión con MongoDB.
 * @author j
 *
 */
public class prueba2 {
	/**
	 * Main del proyecto.
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("Prueba conexión MongoDB");
		MongoClient mongo = crearConexion();

		if (mongo != null) {

			//Si no existe la base de datos la crea
			DB db = mongo.getDB("bd-ejemplo");
			System.out.println();

			//Crea una tabla si no existe y agrega datos
			insertTrabajador(db, "trabajador", "Jose", "Lopez Perez", 45);
			insertTrabajador(db, "trabajador", "Maria", "Martinez Aguilar", 35);
			insertTrabajador(db, "trabajador", "Juan", "Navarro Robles", 25);
			insertTrabajador(db, "trabajador", "Lucia", "Casas Meca", 66);
			insertTrabajador(db, "trabajador", "Jose", "Naranjo Moreno", 33);
			insertTrabajador(db, "trabajador", "Jose Luis", "Romero Diaz", 55);
			insertTrabajador(db, "trabajador", "Ana", "Canovas Perez", 24);
			insertTrabajador(db, "trabajador", "Lucia", "Martinez Martinez", 67);

			//Actualiza la edad de los trabajadores con el nombre "Jose"
			updateNombreTrabajador(db, "trabajador", "Jose", 46);

			//Listar la tabla "trabajador"
			System.out.println("Listar los registros de la tabla: ");
			selectTablas(db, "trabajador");
			System.out.println();

			//Listar de la tabla "trabajador" aquellos que se llamen "Jose"
			System.out.println("Listar los registros de la tabla cuyo nombre sea Jose: ");
			selectTablasWhere(db, "trabajador", "Jose");
			System.out.println();

			//Eliminar los trabajadores cuyo nombre sean "Ana"
			deleteTrabajadorPorNombre(db, "trabajador", "Ana");

			//Eliminar los trabajadores cuyos anyos sean mayor que 50
			deleteTrabajadorEdadMayorQue(db, "trabajador", 65);

			//Eliminar los trabajadores con los apellidos abajo indicados en la lista
			List lista = new ArrayList();
			lista.add("Casas Meca");
			lista.add("Navarro Robles");
			deleteTrabajadorEnLista(db, "trabajador", lista);

			//Listar la tabla "trabajador" (otra vez)
			System.out.println("Listar los registros de la tabla: ");
			selectTablas(db, "trabajador");
			System.out.println();

			//Listar las tablas de la base de datos actual
			System.out.println("Lista de tablas de la base de datos: ");
			printColecciones(db);
			System.out.println();

			//Listas las bases de datos
			System.out.println("Lista de todas las bases de datos: ");
			printDatabases(mongo);
			System.out.println();

			//Borrar base de datos
            db.dropDatabase();

		} else {
			System.out.println("Error: Conexión no establecida");
		}
	}

	/**
	 * Ejemplo para crear una conexión a MongoDB.
	 * @return MongoClient conexión
	 */
	private static MongoClient crearConexion() {
		MongoClient mongo = null;
		try {
			mongo = new MongoClient("localhost", 27017);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		return mongo;
	}

	/**
	 * Ejemplo que imprime por pantalla todas las bases de datos MongoDB.
	 * @param mongo conexión a MongoDB
	 */
	private static void printDatabases(MongoClient mongo) {
		List basesDeDatos = mongo.getDatabaseNames();
		for (String nombreBaseDatos : basesDeDatos) {
			System.out.println(" - " + nombreBaseDatos);
		}
	}

	/**
	 * Ejemplo que imprime por pantalla todas las colecciones / tablas de una base de datos.
	 * @param db de tipo DB
	 */
	private static void printColecciones(DB db) {
		Set tables = db.getCollectionNames();

		for(String coleccion : tables){
			System.out.println(" - " + coleccion);
		}
	}

	/**
	 * Ejemplo que inserta un registro dado un DB, nombre de tabla y campos de la tabla (id, nombre, apellidos y años).
	 * @param db
	 * @param tabla
	 * @param id
	 * @param nombre
	 * @param apellidos
	 * @param anyos
	 */
	private static void insertTrabajador(DB db, String tabla, String nombre, String apellidos, int anyos) {
		//Recoge datos de la tabla
		DBCollection table = db.getCollection(tabla);

		//Crea un objecto básico y le añade elementos
		BasicDBObject document = new BasicDBObject();
		document.put("nombre", nombre);
		document.put("apellidos", apellidos);
		document.put("anyos", anyos);
		document.put("fecha", new Date());

		//Inserta la tabla
		table.insert(document);
	}

	/**
	 * Ejemplo que modifica el campo anyos dado una DB, tabla e id de usuario.
	 * Hay varias formas de actualizar los registros, y ésta es una de ella.
	 * Otros tipos de actualización de registros aquí: http://www.mkyong.com/mongodb/java-mongodb-update-document/
	 *
	 * @param db
	 * @param tabla
	 * @param id
	 * @param nuevosAnyos
	 */
	private static void updateNombreTrabajador(DB db, String tabla, String nombre, int nuevosAnyos) {
		//Recoge datos de la tabla
		DBCollection table = db.getCollection(tabla);

		//Prepara para insertar un nuevo campo
		BasicDBObject updateAnyos = new BasicDBObject();
		updateAnyos.append("$set", new BasicDBObject().append("anyos", nuevosAnyos));

		//Busca el/los registro/s con el nombre indicado
		BasicDBObject searchById = new BasicDBObject();
		searchById.append("nombre", nombre);

		//Realiza la actualización
		table.updateMulti(searchById, updateAnyos);
	}

	/**
	 * Ejemplo que imprime por pantalla todos los trabajadores
	 * @param db
	 * @param tabla
	 */
	private static void selectTablas(DB db, String tabla) {
		//Recoge datos de la tabla
		DBCollection table = db.getCollection(tabla);

		//Busca y muestra todos los datos de la tabla
		DBCursor cur = table.find();
		while (cur.hasNext()) {
			System.out.println(" - " + cur.next().get("nombre") + " " + cur.curr().get("apellidos") + " -- " + cur.curr().get("anyos") + " años (" + cur.curr().get("fecha") + ")");
	    }
	}

	/**
	 * Ejemplo que imprime por pantalla todos los trabajadores con nombre indicado
	 * @param db
	 * @param tabla
	 * @param nombre
	 */
	private static void selectTablasWhere(DB db, String tabla, String nombre) {
		//Recoge datos de la tabla
		DBCollection table = db.getCollection(tabla);

		//Creando el filtro en el campo "nombre"
		BasicDBObject query = new BasicDBObject();
		query.put("nombre", nombre);

		//Busca y muestra todos los datos de la tabla donde "nombre" sea el indicado
		DBCursor cur = table.find(query);
		while (cur.hasNext()) {
			System.out.println(" - " + cur.next().get("nombre") + " " + cur.curr().get("apellidos") + " -- " + cur.curr().get("anyos") + " años (" + cur.curr().get("fecha") + ")");
		}
	}

	/**
	 * Ejemplo que elimina los trabajadores con nombre indicado
	 * @param db
	 * @param tabla
	 * @param nombre
	 */
	private static void deleteTrabajadorPorNombre(DB db, String tabla, String nombre) {
		//Recoge datos de la tabla
		DBCollection table = db.getCollection(tabla);

		//Indica el campo y valor y lo elimina
		table.remove(new BasicDBObject().append("nombre", nombre));
	}

	/**
	 * Ejemplo que elimina los trabajadores con una edad mayor a la indicada
	 * @param db
	 * @param tabla
	 * @param anyos
	 */
	private static void deleteTrabajadorEdadMayorQue(DB db, String tabla, int anyos) {
		//Recoge datos de la tabla
		DBCollection table = db.getCollection(tabla);

		//Indica el campo y valor que ha de ser mayor para eliminarlo
		BasicDBObject query = new BasicDBObject();
		query.put("anyos", new BasicDBObject("$gt", anyos));
		table.remove(query);
	}

	/**
	 * Ejemplo que elimina los trabajadores cuyos apellidos estén en una lista
	 * @param db
	 * @param tabla
	 * @param lista
	 */
	private static void deleteTrabajadorEnLista(DB db, String tabla, List lista) {
		//Recoge datos de la tabla
		DBCollection table = db.getCollection(tabla);

		//Indica la lista de nombres que quiere eliminar
		BasicDBObject query = new BasicDBObject();
		query.put("apellidos", new BasicDBObject("$in", lista));
		table.remove(query);
	}
}

Un comentario en “Conectando una aplicación Java con MongoDB en Windows

Leave a comment

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s