Introducción a la base de datos NoSQL MongoDB: Instalación, primeros pasos y ejemplo de conexión con Java

Como bien comenta el sitio web de MongoDB:  Combining the best features of JSON databases, key-value stores, and RDBMSes.

MongoDB es una base de datos NoSQL, asi que olvidate de tablas y relaciones entre tablas, en MongoDB lo más parecido que encontraremos a una tabla son las colecciones, que vienen a ser una especie de listas donde vamos almacenando los diferentes objetos y sus atributos.  Se abandona el enfoque relacional por bases de datos mas orientadas a objetos y de esta manera es como se procesa la información.

Tal y como se comenta en BarraPunto:

«Una reunión en San Francisco fue la inauguración de la comunidad de NoSQL, un grupo de personas que comparten la idea de destronar la tiranía de las bases de datos relaciones, costosas y lentas, en favor de una alternativa mucho más eficiente y barata para manipular datos. “Las bases de datos relacionales nos ofrecen demasiado. Nos fuerzan a adaptar nuestros objetos para adaptarlos a una RDBMS (sistema de gestión de bases de datos relacional)”, dice Jon Travis, uno de los principales ingenieros en SpringSource, y uno de los 10 presentadores en la reunión de NoSQL. Las alternativas basadas en NoSQL “te ofrecen sólo lo que necesitás”, dice Travis».

Estas bases de datos son bastantes eficientes en entornos de clustering.

De hecho plataformas como Digg ya están empleandolas. Segun comentan en el Blog de la empresa, abandonaron las Bases de datos relacionales por las limitaciones que estas tienen cuando se escalan grandes volumenes de datos.
Además de las ventajas cuando se tienen que añadir o reemplazar nodos caidos sin ningun downtime ((sin tener que apagar el hardware/servers/datacenters, ni el software/DBs).

Hay muchisimas bases de datos NoSQL (p.ej Cassandra, Redis, entre otras), cada una con diferentes propositos: Unas a almacenar documentos,otras: objetos, grafos, claves/valor, etc. Si me preguntas cual es mejor o peor no te lo podre decir ahora mismo (pues no he tenido la ocasión de probar todas y cada una), si escribo este tutorial acerca de MongoDB es sencillamente porque es la primera por la que he empezado ^^.

INSTALACION DE MONGODB

Las instrucciones de instalación las encontramos en el propio site de MongoDB.

Para el caso de Linux 32:

# creamos  un directorio por defecto para los datos
$ sudo mkdir -p /data/db

# usamos curl, para obtener la ultima versión:
$ curl -O http://downloads.mongodb.org/linux/mongodb-linux-i686-latest.tgz

# desempaquetamos en el directorio deseado y listo.
$ tar xzf mongodb-linux-i686-latest.tgz

EJECUCION

# Es mejor ejecutar la base de datos en background -  usando un terminal separado para testing
./mongodb-xxxxxxx/bin/mongod &

# ejecutamos  el shell mongo.  por defecto se conectara a localhost. Nota: reemplaza xxxxx por el número de version correspondiente que estes utilizando:
./mongodb-xxxxxxx/bin/mongo

# Vamos ahora a hacer una insercion, Guardando una entrada del tipo a=1
> db.foo.save( { a : 1 } )

# Imprime el contenido de las keys almacenadas
> db.foo.find()

# chachi!!

Output al arrancar:

Al iniciar la base de datos, obtendremos una salida similar a la siguiente:

root@soledad:~/Escritorio/mongodb-linux-i686-2010-04-06/bin#./mongod &
[1] 21996
root@soledad:~/Escritorio/mongodb-linux-i686-2010-04-06/bin#./mongod
--help for help and startup options
Wed Apr  7 10:44:21 Mongo DB : starting : pid = 21996 port = 27017
dbpath = /data/db/ master = 0 slave = 0  32-bit
****
WARNING: This is development version of MongoDB.  Not recommended for
production.
****

** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data
**       see http://blog.mongodb.org/post/137788967/32-bit-limitations for more

Wed Apr  7 10:44:21 db version v1.5.0-pre-, pdfile version 4.5
Wed Apr  7 10:44:21 git version: 418c926354f9d4a77068963923386ad21eacbe7d
Wed Apr  7 10:44:21 sys info: Linux domU-12-31-39-01-70-B4
2.6.21.7-2.fc8xen #1 SMP Fri Feb 15 12:39:36 EST 2008 i686
BOOST_LIB_VERSION=1_37
Wed Apr  7 10:44:21 waiting for connections on port 27017
Wed Apr  7 10:44:21 web admin interface listening on port 28017

Ejemplo de uso desde consola:

jose@soledad:~/Escritorio/mongodb-linux-i686-2010-04-06/bin$./mongo
MongoDB shell version: 1.5.0-pre-
url: test
connecting to: test
type "help" for help
> help
HELP
show dbs                     show database names
show collections             show collections in current database
show users                   show users in current database
show profile                 show most recent system.profile entries
with time >= 1ms
use <db name>                set curent database to <db name>
db.help()                    help on DB methods
db.foo.help()                help on collection methods
db.foo.find()                list objects in collection foo
db.foo.find( { a : 1 } )     list objects in foo where a == 1
it                           result of the last line evaluated; use
to further iterate
> show dbs
admin
local
> show collections
> db.foo.save ( { a : 1 } )
> db.foo.find()
{ "_id" : ObjectId("4bbc46724cd1cb4fecc45ff6"), "a" : 1 }
> exit
bye

Ejemplo de uso en Java:

Lo primero es descargar e añadir al classpath el driver .jar necesario para poder conectar a la base de datos. Os dejo a continuacion un ejemplo de conexion a la base de datos y de diferentes acciones (inserciones, consulta) sobre la misma, el ejemplo esta basado en la documentación oficial , está lo suficientemente comentado y espero sirva de base para vuestros futuros desarrollos.


/**
 * Hay que añadir mongo-XX.jar al classpath
 * 
 * EJEMPLO extraido de:
 http://vsbabu.org/mt/archives/2010/03/02/simple_mongodbjava_example.html
 y
 * Tutorial MONGO:
 http://www.mongodb.org/display/DOCS/Java+Tutorial#JavaTutorial-Introduction
 */

import java.util.List;
import java.util.Set;
import java.util.logging.*;
import java.net.UnknownHostException;
import java.util.regex.Pattern;
import com.mongodb.*;

public class NoSQLDB {

	public static void main(String[] args) {

       Logger log = Logger.getLogger("NoSQLDb");

       try
       {

                                       log.info("iniciado");

                                       // Conectar a bd y recuperar una
										// coleccion
                           Mongo m = new Mongo("localhost", 27017);
                           DB db = m.getDB("sampledb");
                           DBCollection coll = db.getCollection("people");
                           log.info("collection es: " + coll);

                           // Recuperar lista de colecciones de la base de
							// datos
                           Set<String> colls = db.getCollectionNames();

                           System.out.println("<<<<<<<<<< Colecciones de la BD
>>>>>>>>>>>>");
                           for (String s : colls) {
                               System.out.println(s);
                           }


                           DBCollection docs = db.getCollection("docs");
                           log.info("collection docs is : " + docs);

                           // limpiando la coleccion previa de datos
                           DBCursor cur2 = docs.find();
                           while (cur2.hasNext())
                                        docs.remove(cur2.next());

                           // insertando algunos docs de pruebas
                           insertDoc(docs,1,100,200);
                           insertDoc(docs,2,0,0);

                           // recuperando el primero de la coleccion
                           DBObject myDoc = docs.findOne();
                           System.out.println(myDoc);

                           // insertando 100 items simples del tipo { i=valor}
							// a la coleccion

                           for (int i=0; i < 100; i++) {
                               docs.insert(new BasicDBObject().append("i",
i).append("inverso",100-i));
                           }

                           // Contando numero de elementos
                           System.out.println(docs.getCount());

                           // imprimir todos
                          cur2 = docs.find();

                           while(cur2.hasNext()) {
                               System.out.println(cur2.next());
                           }

                           // consulta simple
                           BasicDBObject query = new BasicDBObject();

                           query.put("i", 71);

                           cur2 = docs.find(query);

                           while(cur2.hasNext()) {
                               System.out.println("----consulta id=71--------"+cur2.next());
                           }

                           // consulta compuesta
                           query = new BasicDBObject();

                           query.put("i", new BasicDBObject("$gt",
95).append("$lte", 97));  // e.g. find all where i > 50

                           cur2 = docs.find(query);

                           while(cur2.hasNext()) {
                               System.out.println(" mayor de 95 y menorigual
97:"+cur2.next());
                           }

                           // crear un indice
                           docs.createIndex(new BasicDBObject("i", 1));  // create
index on "i", ascending

                           // ver lista indices coleccion
                           List<DBObject> list = coll.getIndexInfo();

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

                           // ver todas las bases de datos
                           m = new Mongo();

                           for (String s : m.getDatabaseNames()) {
                               System.out.println(s);
                           }

                           // Borrar una base de datos
                          // m.dropDatabase("my_new_db");


                           // limpiar entradas si hay alguna
                           DBCursor cur = coll.find();
                           while (cur.hasNext())
                                        coll.remove(cur.next());

                           // crear indice e insertar algunas entradas en la
							// coleccion
                           coll.ensureIndex(new BasicDBObject("id",
1).append("unique", true));
                           coll.createIndex(new BasicDBObject("name", 1));
                           coll.insert(makePersonDocument(6655, "James", "male"));
                           coll.insert(makePersonDocument(6797, "Bond", "male"));
                           coll.insert(makePersonDocument(6643, "Cheryl", "female"));
                           coll.insert(makePersonDocument(7200, "Scarlett", "female"));
                           coll.insert(makePersonDocument(6400, "Jacks", "male"));

                           log.info("Total Records : " + coll.getCount());

                           // imprimir todos
                           cur = coll.find();
                           printResults(cur, "Find All Records");

                           // buscando por id (no hay SQL son bases de datos
							// como
orientadas a objetos)
                           cur = coll.find(new BasicDBObject("id", 6655));
                           printResults(cur, "Find id = 6655");

                           // buscando los items con id menor ($lte) a 6700
                           cur = coll.find(new BasicDBObject().append("id", new
BasicDBObject("$lte", 6700)));
                            printResults(cur, "Find id <= 6700");

                           // buscando los items con id menor que 6700 y genero
igual a masculino
                           cur = coll.find(new BasicDBObject()
                                              .append("id", new BasicDBObject("$lte", 6700))
                                              .append("gender", "male"));
                                      printResults(cur, "Find id <= 6700 and gender = male");

                            // Buscando los items cuyo name empiece por ja y
							// acabe
en s, y ordenarlos de manera inversa (seria el LIKE 'ja%s')
                            cur = coll.find(new BasicDBObject()
                                               .append("name",
Pattern.compile("^ja.*?s$", Pattern.CASE_INSENSITIVE)))
                                               .sort(new BasicDBObject("name", -1));
                                       printResults(cur, "Find name like Ja%s and
sort reverse by name");

                            // ejempo de actualizacion, recorre todos, y reduce
							// el
id en 10 unidades (operador $inc -10), ademas si es masculino añade
Sir al nombre, y si es femenino añade Mme
                            cur  = coll.find();
                                                  while(cur.hasNext()) {
                                                      BasicDBObject set = new
BasicDBObject("$inc", new BasicDBObject("id", -10));
                                                      if
("male".equals(cur.next().get("gender")))
                                                          set.append("$set", new
BasicDBObject("name", "Sir ".concat((String)
cur.curr().get("name"))));
                                                      else
                                                          set.append("$set", new
BasicDBObject("name", "Mme ".concat((String)
cur.curr().get("name"))));
                                                      coll.update(cur.curr(), set);
                                                  }
                                                  cur  = coll.find();
                                                  printResults(cur, "All, after id
and name update");

                           log.info("finalizado");

       }
       catch(Exception e)
       {
               e.printStackTrace();
       }

       }

	private static BasicDBObject makePersonDocument(int id, String name,
			String gender) {
		BasicDBObject doc = new BasicDBObject();
		doc.put("id", id);
		doc.put("name", name);
		doc.put("gender", gender);
		return doc;
	}

	private static void insertDoc(DBCollection coll, int count, int x, int y) {
		BasicDBObject doc = new BasicDBObject();

		doc.put("name", "MongoDB");
		doc.put("type", "database");
		doc.put("count", count);

		BasicDBObject info = new BasicDBObject();

		info.put("x", x);
		info.put("y", y);

		doc.put("info", info);

		coll.insert(doc);

	}

	private static void printResults(DBCursor cur, String message) {
		System.out.println("<<<<<<<<<< " + message + " >>>>>>>>>>>>");
		while (cur.hasNext()) {
			System.out.println(cur.next().get("id") + ","
					+ cur.curr().get("name") + "," + cur.curr().get("gender"));
		}
	}

}

18 Responses to “Introducción a la base de datos NoSQL MongoDB: Instalación, primeros pasos y ejemplo de conexión con Java”


  1. 1 Federico abril 13, 2010 a las 9:50 pm

    Excelente artículo! (espero ansioso la sección Ejemplo de uso en Java)

  2. 3 lautaro abril 14, 2010 a las 2:28 pm

    Hola, te tengo en mis feeds y este post me dio para comentarte un par de cosas:

    1) el css del sitio desperdicia muchísimo lugar en los costados.
    2) el coloreador (highlighting) de código te ocupa mucho lugar, y el código termina no entendiéndose en absoluto (dudo que alguien lo mire desde el sitio, estoy con una resolución de 1280 y parece una sopa de fideos la parte de java).
    También, podrías habilitar la opción para ver el código sin css, ya que hacer copy&paste te tira los números de línea.

    3) no se si el código en java es tuyo, es un “quilombo”. No da como para refactorizar un poco el código por métodos que encapsulen comportamiento? Así se me haría más fácil entender el código ya que parece procedural y no objetos 🙂

    4) me gusta bastante el blog 🙂

    Saludos

  3. 5 Ricky abril 16, 2010 a las 2:13 am

    Muy buen post voy a trastear con la base de datos y a ver si se puede portar a c# gracias Jose, un abrazo

  4. 6 Alexandra octubre 28, 2010 a las 4:04 pm

    Hola Una pregunta la conexion a la BD se debe cerrar?

    • 7 superpiwi octubre 28, 2010 a las 5:22 pm

      Es recomendable si. Para evitar ir dejando conexiones abiertas y que se vayan acumulando. La idea seria crear una conexion (o usar un pool), ejecutar las sentencias o transacciones y liberar la conexion.

  5. 8 Guiller mayo 18, 2011 a las 1:32 am

    Excelente ejemplo alguien conoce alguna base de datos Orientada a Objetos gratuita

  6. 9 Guiller mayo 18, 2011 a las 1:34 am

    MogoDb se podra instalar sobre un ambiente windows ??

  7. 10 Yeni junio 9, 2011 a las 8:43 pm

    Tengo que hacer un modelo de datos, es decir un modelo entidad relacion de una base de datos documental, esto se hace como se hace con las base de datos con tablas y relaciones y eso… o hay otra forma de hacerlo.

    plissss necesito respuesta urgente!!!!!!!!!!!!!!!!!!!!!1

  8. 11 Alfredo G agosto 24, 2011 a las 5:19 pm

    yo tengo una pregunta. estoy tratando de asimilar esto que es totalmente nuevo, en relacion a todo lo de base de datos que se. pero tengo una pregunta:
    en el modelo entidad relacion de la mayoria de bases de datos existen tablas que se relacionan unas con otras muchas veces para no repetir informacion.
    ejemplo:
    una tabla “trabajdor” se relaciona con una tabla “profesion”. entonces muchos trabajadores pueden tener una misma profesion. esto hace que no tengamos que escribir la msima profesion para cada trabajador, sino, solo lo relacionamos..

    pero en mongodb, no se como se crearia ese vinculo, meimaigno que como es orientado a objetos, habra una forma de heredar datos. pero no estoy seguro, quisiera saber si es asi, y un ejemplode como crear esas dos tablas o colecciones. espero haber sido claro en mi pregunta. muchas gracias.

  9. 14 Hector octubre 15, 2013 a las 11:49 pm

    jaja q chistosas preguntas con todo cariño…..


  1. 1 Introducción a la base de datos NoSQL MongoDB: Instalación, primeros pasos y ejemplo de conexión con Java | Ayuda Linux Trackback en abril 13, 2010 a las 10:01 pm
  2. 2 Linux Hispano | Lo mejor de mi RSS del 12 al 18 de abril Trackback en abril 18, 2010 a las 12:04 pm
  3. 3 Usando bases de datos nosql - mongodb - Blog - zylk.net Trackback en julio 4, 2011 a las 6:33 pm
  4. 4 RoboMongo: Herramienta de administración para MongoDB | Ubuntu Life Trackback en febrero 27, 2014 a las 8:50 pm

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s







¿Es compatible tu equipo con Ubuntu?


( Muchos fondos de pantalla, aqui )

DESCARGATE SCIFI LIFE

365 Dias de Soledad
Me debes los sueños, las promesas y las noches rotas. Me debes la paz, la sonrisa y la esperanza robadas. Me debes la sangre, las lágrimas y el sudor vertido. Me debes las noches vacías, los abrazos anhelados. Me debes un beso de ajenjo de tu amarga boca.

The Ubuntu Counter Project - user number # 11961
Geo Visitors Map

Archivos

abril 2010
L M X J V S D
 1234
567891011
12131415161718
19202122232425
2627282930  

Blog Stats

  • 31.239.387 hits

A %d blogueros les gusta esto: