lunes, 24 de mayo de 2010

Primeros pasos en Java y MongoDB - Parte 2

En la entrada anterior abordamos cómo conectar a la base de datos MongoDB y cómo realizar consultas. En el presente post abordaremos cómo modificar datos en una colección.


Inserciones
La operación más sencilla es la inserción, gracias a la cual añadimos un nuevo documento a una colección. Tomemos el siguiente ejemplo extraído del tutorial de Java de MongoDB. Tenemos el siguiente documento:


{
  "name" : "MongoDB",
  "type" : "database",
  "count" : 1,
  "info" : {
    x : 203,
    y : 102
  }
}


El campo info es un documento embebido dentro del documento principal. La forma de añadir este documento a MongoDB mediante código Java, sería la siguiente:


// Conexion por defecto a localhost por el puerto 27017
Mongo con = new Mongo();
DB bbdd = con.getDB("nombreBaseDatos");
DBCollection col = bbdd.getCollection("nombreColeccion");

BasicDBObject doc = new BasicDBObject();

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

BasicDBObject info = new BasicDBObject();

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

doc.put("info", info);

col.insert(doc);


En el ejemplo anterior hemos almacenado un único documento. Si lo que se desea es almacenar una lista de documentos de una sola vez, es posible crear un array o una lista de tipo DBOject, y pasar éste como parámetro. El método insert añadirá todos los documentos a la colección.


abstract void insert(DBObject arr[])

abstract foid insert(List list)


Nota: En el caso anterior, el documento contenía pares campo/valor de tipo nativo (cadenas de texto, números) o de tipo documento (embebido). Si el dato es un array, definir un tipo Vector, y asignarlo como valor a un campo.


Actualizaciones
La actualización permite modificar un documento ya existente.

Existe varias maneras de hacerlo. La primera es mediante el método save, cuya sintaxis es la siguiente:


public final void save(DBOject doc)


El funcionamiento de este método es muy simple: "guardar el documento 'doc', sustituyendo si ya existe, o añadiendo si no existe". En el caso de la sustitución, el documento debe tener el campo "_id" y el valor correspondiente del documento a sustituir.

Otra forma de actualizar documentos es mediante el método update, el cual posee varias posibilidades. La más sencilla sería por sustitución de documento:


BasicDBObject oquery = new BasicDBObject();
oquery.put("name", "MongoDB");
oquery.put("type", "database");

BasicDBObject doc = new BasicDBObject();

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

BasicDBObject info = new BasicDBObject();

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

doc.put("info", info);

col.update(oquery, doc);


El método update admite varias sintaxis. En la utilizada en el ejemplo anterior, recoge dos parámetros. El primero de ellos (oquery), contiene un documento de filtro, en el que se especifican los campos y valores que deben cumplirse para los documentos a modificar. En este caso, las condiciones eran "cuyo 'name' tenga el valor 'MongoDB' Y cuyo 'type' tenga el valor 'database'". Si hubiese más de un documento que se correspondiera con el resultado del filtro, por defecto, se asumiría el primero.

El segundo parámetro sería un documento completo que sustituirá por completo al documento encontrado.

Otra forma modificar documentos sería a través de operaciones atómicas. Esto significa que se modifica directamente un elemento del documento, en lugar de sustituir el documento completo. El siguiente ejemplo cambiaría el valor del campo count:


BasicDBObject oquery = new BasicDBObject();
oquery.put("name", "MongoDB");
oquery.put("type", "database");

BasicDBObject doc = new BasicDBObject();
BasicDBObject op = new BasicDBObject();
op.put("count", 4);
doc.put("$set", op);

col.update(oquery, doc);


Esto sería similar a la sentencia SQL:

UPDATE col SET count=4 WHERE name='MongoDB' AND type='database'

Existe una lista rica de operaciones atómicas, muy útiles según el caso. Para más información, consulta la siguiente URL:

http://www.mongodb.org/display/DOCSES/Actualizar

El método update permite las siguientes sintaxis:


public void update(
  DBObject query,
  DBOject doc)

public abstract void update(
  DBObject query,
  DBObject doc,
  boolean upsert,
  boolean multi)


La primera de ellas, es la vista anteriormente. La segunda de ellas, posee cuatro parámetros. Los dos primeros ya los conocemos. Los dos restantes:

- upsert: Si se especifica el valor true, si el filtro se cumple, actualiza los documentos encontrados. Si no se cumple, añade el documento doc a la colección (como un insert). Si se especifica el valor false (por defecto), sólo permite actualizar, no insertar.
- multi: Si se especifica el valor true, si el filtro retorna varios documentos, las actualizaciones se realizarán sobre todos ellos. Si se especifica el valor false (por defecto), las actualizaciones sólo se realizarán sobre el primer documento retornado.

El driver Java de MongoDB ofrece también el método updateMulti, cuya sintaxis es la siguiente:


public void updateMulti(
  DBObject query,
  DBOject doc)


La sintaxis es exactamente igual que la primera del método update. Sin embargo, update solamente actualiza el primer documento encontrado por el filtro. Con updateMulti las actualizaciones se aplicarían a todos los documentos encontrados.


Eliminaciones
Para eliminar documentos, se utiliza el método remove, cuya sintaxis es la siguiente:

public abstract void remove(DBObject query)

El parámetro query es un filtro que determina qué documentos han de coincidir para la eliminación. Dicha eliminación se aplica a todos los documentos que coincidan con el filtro.