:::: MENU ::::

MongoDB

Introducción

MongoDB es una base de datos no relacional orientada a documentos, que se almacenan en formato JSON dentro de colecciones. La correspondencia con la terminología de bases de datos relacionales (MySQL, Oracle, etc.) sería la siguiente: una colección sería una base de datos y un documento sería una tabla. En las bases de datos relacionales la información puede verse fácilmente en una tabla, a que hay un objeto simple en cada celda, pero en bases de datos no relacionales cada celda puede contener un objeto complejo, que habría que desplegar para poder ver su interior.

Instalación

Vamos a https://www.mongodb.com/download-center y pulsamos en la pestaña “Community Server”. Hacemos clic en “DOWNDLOAD”. Ejecutamos el instalador y aceptamos la configuración por defecto.

Arranque del servidor

Para arrancar el servidor de MongoDB simplemente hay que ejecutar el fichero “mongod.exe”, situado en la carpeta “MongoDB\Server\3.6\bin\” (la localización de la misma dependerá de cómo hayamos hecho la instalación).

Cliente de MongoDB (Compass)

Lanzamos la aplicación MongoDB Compass Community y nos conectamos con los valores por defecto (localhost:27017). Este cliente nos permitirá realizar operaciones sobre las colecciones y los documentos.

Introducción de registros con Eclipse

Generamos un proyecto con Spring Boot y añadimos la dependencia de MongoDB.

Creamos los siguientes componentes:

MyEntity.java

package com.luisgomezcaballero.mongodbinserts;

import org.springframework.data.annotation.Id;

public class MyEntity {
	@Id
	public String Id;

	public String text;
	public String user_name;
	public String status;

	public MyEntity() {
	}

	public MyEntity(String text, String user_name, String status) {
		super();
		this.text = text;
		this.user_name = user_name;
		this.status = status;
	}

	@Override
	public String toString() {
		return "MyEntity [Id=" + Id + ", text=" + text + ", user_name=" + user_name + ", status=" + status
				+ ", getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString()
				+ "]";
	}

}

MyEntityRepository.java

package com.luisgomezcaballero.mongodbinserts;

import org.springframework.data.mongodb.repository.MongoRepository;

public interface MyEntityRepository extends MongoRepository<MyEntity, String> {

}

MongodbinsertsApplication.java

package com.luisgomezcaballero.mongodbinserts;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MongodbinsertsApplication implements CommandLineRunner {

	@Autowired
	private MyEntityRepository repository;

	public static void main(String[] args) {
		SpringApplication.run(MongodbinsertsApplication.class, args);
	}

	@Override
	public void run(String... args) throws Exception {

		repository.deleteAll();

		repository.save(new MyEntity("text1", "user1", "active"));
		repository.save(new MyEntity("text2", "user1", "active"));
		repository.save(new MyEntity("text3", "user2", "disabled"));
		repository.save(new MyEntity("text4", "user2", "active"));
		repository.save(new MyEntity("text5", "user2", "disabled"));
		repository.save(new MyEntity("text6", "user2", "active"));
		repository.save(new MyEntity("text7", "user2", "disabled"));
		repository.save(new MyEntity("text8", "user2", "active"));
		repository.save(new MyEntity("text9", "user3", "active"));

		System.out.println("findAll():");
		for (MyEntity myEntity : repository.findAll()) {
			System.out.println(myEntity);
		}

	}
}

Lanzamos esta aplicación mediante “Run As/Java Application” sobre la clase principal “MongodbinsertsApplication”. Esto insertará los datos y podremos revisarlos mediante el cliente Compass.

MapReduce con Eclipse

MapReduce es un algoritmo que se divide en dos fases: la fase Map, que simplemente agrupa claves con valores diferentes en forma de array (ej.: clave 1, [valor 1, valor 2, valor 3]) y Reduce, que reduce estos valores de array a uno único mediante una función de agrupación (ej.: clave 1, (valor1+valor2+valor3)/3).

Generamos otro proyecto con Spring Boot y añadimos la dependencia de MongoDB.

Creamos el siguiente componente:

MongodbmapreduceApplication.java

package com.luisgomezcaballero.mongodbmapreduce;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MapReduceCommand;
import com.mongodb.MapReduceOutput;
import com.mongodb.MongoClient;

@SpringBootApplication
public class MongodbmapreduceApplication implements CommandLineRunner {

	public static void main(String[] args) {
		SpringApplication.run(MongodbmapreduceApplication.class, args);
	}

	@Override
	public void run(String... args) throws Exception {

		MongoClient mongo = null;
		try {
			mongo = new MongoClient("localhost", 27017);

			DB db = mongo.getDB("test");

			DBCollection collection = db.getCollection("myEntity");

			String map = "function () { emit(this.user_name, 1); }";

			String reduce = "function (key, values) { return Array.sum(values); }";

			DBObject dbObject = new BasicDBObject();
			dbObject.put("status", "active");

			MapReduceCommand cmd = new MapReduceCommand(collection, map, reduce, "total",
					MapReduceCommand.OutputType.REPLACE, dbObject);

			MapReduceOutput out = collection.mapReduce(cmd);

			for (DBObject o : out.results()) {
				System.out.println(o.toString());
			}

			System.out.println("Done");

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			mongo.close();
		}
	}
}

Al ejecutar este programa (de la misma forma que el anterior), veremos mediante Compass que se ha creado una nueva colección “total” en la que veremos el resultado de la operación.

Repositorio

Estos dos proyectos pueden encontrarse en https://github.com/luisgomezcaballero/mongodbinserts y en https://github.com/luisgomezcaballero/mongodbmapreduce respectivamente.


So, what do you think ?