CouchDB (Parte II)

En la entrada anterior vimos un poco (por decir NADA) de CouchDB, nos conectamos a Cloudant e insertamos un registro … más que eso no hicimos😯 … principalmente porque aún no entiendo casi nada de ésta cosa … es muy enredado😛

Ahora vamos a ver más cosillas.

CouchDB no tiene Tablas o Colecciones

Así, tal cual. Una DB es un contenedor que no tiene divisiones, por lo que tenemos documentos juntos. La idea es que no estén revueltos. Es “extraño” cuando menos… pero bue, así lo hicieron😀

Para “solucionar” el tema, a cada documento (objeto) le agregamos un campo para definir el tipo. Algo así:

public class Usuario {

    private String Nombre,
        Pass,
        Mail,
        Tipo;
    private Date FechaRegistro;

    public Usuario(String nombre, String mail, String pass) throws
            UnsupportedEncodingException, NoSuchAlgorithmException {
        Nombre = nombre;
        setPass(pass);
        Mail = mail;
        Tipo = "Usuario";
        FechaRegistro = new Date();
    }
}

Y con ésto podemos deferenciar entre documentos cuando ocupemos vistas.

Vistas

Más que guardar y mantener la información, lo más importante es como verla o recuperarla. Aquí entran las vistas, ya que CouchDB no “tiene” formas para hacer querys (al estilo MongoDB, por ejemplo).

Siguiendo el ejemplo anterior, tenemos algo así: Captura de pantalla 2014-01-25 a la(s) 13.30.58 Y si queremos crear un login de usuarios ? Porque, ya los tenemos registrados…

Las vistas en realidad son índices secundarios (el primario es el campo _id). Por ejemplo, queremos indexar por el Mail de cada persona: Captura de pantalla 2014-01-25 a la(s) 14.34.15Ésta función lo que hace es recorrer TODOS los documentos en nuestra DB (en el parámetro doc). Luego, comprobamos que indexe únicamente documentos con el tipo Usuario. Por último generamos el key & value: siendo el Mail del documento la llave y el documento en si el valor.

Y terminamos de ésta manera: Captura de pantalla 2014-01-25 a la(s) 14.49.28 Entonces podemos hacer la query preguntando por la key (en éste caso el Mail) : Captura de pantalla 2014-01-25 a la(s) 14.52.03 Y qué pasa si queremos consultar por el mail y la pass ? En ese caso, modificamos la key y quedamos con:

function(doc) {
  if(doc.Tipo && doc.Tipo == "Usuario"){
    emit([doc.Mail, doc.Pass], doc);
  }
}

De ésta manera, tenemos una llave compuesta entre el mail y la pass Captura de pantalla 2014-01-25 a la(s) 15.00.44 Ahora, saltamos al login desde nuestra aplicación.

Vistas desde Java

Tenemos un login con nada más que el mail y la pass Captura de pantalla 2014-01-25 a la(s) 16.10.37 Entonces, en el Servlet tengo algo así:

Map<String, String> Params = new HashMap<String, String>();
Params.put("Target", "Mail");
Params.put("Param", request.getParameter("mail"));
for(Usuario Us : (List <Usuario>)U.GET(Params)){
  out.write(Us.toString());
}

Que, en resumen, le pide al DAO(U) que le entrege todos los usuarios en un List<Usuario> que tengan el Mail ingresado en el formulario (ojo que no usamos la pass).

UsuarioDao (el objeto U de recién) a su vez tiene lo siguiente:

public Object GET(Map<String, String> M) {
  if(M.get("Target").equals("Mail")){
    return dbClient.view("vistas/Por_Mail"). //Nombre de la Vista
      includeDocs(true).
      key(M.get("Param")). //El parámetro key en la vista
      query(Usuario.class); //La clase a la que se va a Des.Serializar
  }
  return null;
} 

Entonces, revisamos qué nos piden (en éste caso, que Target sea Mail -consultar por Mail) y devolvemos el List<Usuario>.

Si estamos consultando a Cloudant, Captura de pantalla 2014-01-25 a la(s) 16.24.45 fijarse en Nombre del contenedor de Vistas y Nombre de Vista. Juntando éstos dos formamos el nombre “completo” de la vista.

Listo😀 Captura de pantalla 2014-01-25 a la(s) 16.29.37Y si queremos llamar la vista por mail y pass, simplemente agregamos un valor más al campo key:

public Object GET(Map<String, String> M) {
  if(M.get("Target").equals("Mail")){
    return dbClient.view("vistas/Por_Mail"). //Nombre de la Vista
      includeDocs(true).
      key(M.get("Param1"), M.get("Param2")). //El parámetro key en la vista, ahora con 2 valores
      query(Usuario.class); //La clase a la que se va a Des.Serializar
  }
  return null;
} 

Genial😀 !

Eso por ahora😉

Acerca de MaritoCares

Ingeniero Informático. Con tendencias a la programación en [C#, VB].NET, Java(Web principalmente...), PHP, JavaScript, algo mínimo de [ruby, python], y el clásico C.
Esta entrada fue publicada en CouchDB, Java, JavaScript y etiquetada , . Guarda el enlace permanente.

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. 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