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"));
}
}
}






Excelente artículo! (espero ansioso la sección Ejemplo de uso en Java)
pues recien subido.
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
Bueno si tengo otra vez dominio propio podre hacer mejoras. de momento tengo que adaptarme a las plantillas que proporciona wordpress, con apenas opciones de editar el codigo del diseño.
Muy buen post voy a trastear con la base de datos y a ver si se puede portar a c# gracias Jose, un abrazo
Hola Una pregunta la conexion a la BD se debe cerrar?
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.
Excelente ejemplo alguien conoce alguna base de datos Orientada a Objetos gratuita
MogoDb se podra instalar sobre un ambiente windows ??
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
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.
Muy bueno!