Inicio > SQL / noSQL > Iniciando con noSQL

Iniciando con noSQL

El pasado 14-dic-2010 Mario Martinez (http://twitter.com/mromtz) dió la primera plática en el Telmexhub acerca de noSQL y junto con Esteban Guitierrez (http://twitter.com/esteban) crearon una muy buena motivación para los que asistimos y aquí inicio me doy por iniciado…Hoy será la segunda charla (más info) y Mario nos comenta que será una muy breve introducción a CouchDB, lo que se pueda cubrir en 2 hrs.

He creado usuario en http://couchone.com y me fué asignada la dirección http://rictor.couchone.com/_utils

En el sitio de couchone hay mucha información por revisar y para tener una idea de lo que veremos voy a revisar la guía de inicio rápido.

La guía menciona que es necesario hacer una instalación local

Como primer aproximación al uso de CouchDB se usará el comando curl desde una terminal de comandos que se puede encontrar en cualquier distribución de GNU/Linux, asi que para continuar lo primero es abrir una terminal de comandos.

El primer comando es para verificar que la instalación de CouchDB esté corriendo

$ curl http://rictor.couchone.com
{"couchdb":"Welcome","version":"1.0.1"}
$

Para obtener una lista de todas las BDs con el comando

$ curl -X GET http://rictor.couchone.com/_all_dbs
["_users"]
$

Para obtener la misma lista, pero versión debug entonces usar

$ curl -vX GET http://rictor.couchone.com/_all_dbs
* About to connect() to rictor.couchone.com port 80 (#0)
*   Trying 184.73.200.44... connected
* Connected to rictor.couchone.com (184.73.200.44) port 80 (#0)
> GET /_all_dbs HTTP/1.1
> User-Agent: curl/7.20.1 (i686-pc-linux-gnu) libcurl/7.20.1 OpenSSL/1.0.0 zlib/1.2.3 libidn/1.15 libssh2/1.2.2_DEV
> Host: rictor.couchone.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: CouchDB/1.0.1 (Erlang OTP/R13B)
< Date: Tue, 21 Dec 2010 19:53:13 GMT
< Content-Type: text/plain;charset=utf-8
< Content-Length: 11
< Cache-Control: must-revalidate
<
["_users"]
* Connection #0 to host rictor.couchone.com left intact
* Closing connection #0
$

Para crear la primera base de datos llamada baseball con

$ curl -X PUT http://rictor.couchone.com/baseball
{"ok":true}
$

Luego obteniendo la lista de las bases de datos creadas nuevamente

$ curl -X GET http://rictor.couchone.com/_all_dbs
["_users","baseball"]
$

Según la guía, el formato que usa CouchDB es el JavaScript Object Notation (JSON) y por lo tanto los clientes ideales para este tipo de bases de datos son los navegadores web.

Ahora se crea una segunda base de datos y se obtiene la lista de las bases creadas

$ curl -X PUT http://rictor.couchone.com/plankton
{"ok":true}
$
$ curl -X GET http://rictor.couchone.com/_all_dbs
["_users","baseball","plankton"]
$

Ahora se borra la base de datos plankton

$ curl -X DELETE http://rictor.couchone.com/plankton
{"ok":true}
$
$ curl -X GET http://rictor.couchone.com/_all_dbs
["_users","baseball"]

Existe otra manera de poder interactuar con el CouchDB y se llama Futon, para poder usarlo hay que entrar en el sitio http://rictor.couchone.com/_utils

Con Futon para crear una nueva base de datos se da click en Create Database, se abre un diálogo y se escribe el nombre hello-world y la nueva base de datos ha sido creada, ahora Futon muestra una lista de todos los documentos y que en este momento es una lista vacia.

Para crear un documento se da click en New Document, entonces Funton asigna un id para el documento por default, la guía menciona que esto está bien para pruebas, pero para una aplicación es importante asignar el id.

La guía menciona que debería de haber dos campos el _id y _rev y sólo ha aprecido el _id.

Para adicionar un campo se da click en Add field se abre cuadro de texto, se escribe el nombre y se da enter.

El valor inicial para el campo es null, se puede dar doble click y cambiar el valor del campo

Para borrar un campo sólo es necesario dar click en el icono con una X que está a la izquierda del nombre del campo.

Para guardar el documento se da click en Save Document. Cuando se guarda el documento por primera ves, entonces aparece el campo _rev.

Los valores para los campos con los permitidos por JSON, “cadenas”, numero 1,2,3, listas ([1,2,3,”a”,”b”,”ccc”], diccionarios ({“uno”:1, “dos”:2})

Se adicionan los campos listnum, listalphanum y dict y se guarda el documento. Se observa que el número del campo _rev ha cambiado.

Se puede dar click en la pestaña Source y entonces se muestra el documento en formato JOSN y que puede sea más conveniente para algunos casos.

En CouchDB se usan mapas predefinidos (map) y funciones (reduce) que en combinación crean el llamado MapReduce y con este se pueden crear las osnultas. La combinación de un map y una función reduce se conoce como view en terminología de CouchDB.

Antes de poder ejecutar una consulta se necesitar tener algunos datos, se usará un ejemplo de productos de supermercado como manzanas, naranjas y plantanos.

Se usa Futon para crear un documento para manzanas con el siguiente código JSON

{
    "_id" : "bc2a41170621c326ec68382f846d5764",
    "_rev" : "2612672603",
    "item" : "apple",
    "prices" : {
        "Fresh Mart" : 1.59,
        "Price Max" : 5.99,
        "Apples Express" : 0.79
    }
}

Se crea otro documento para naranjas

{
    "_id" : "bc2a41170621c326ec68382f846d5764",
    "_rev" : "2612672603",
    "item" : "orange",
    "prices" : {
        "Fresh Mart" : 1.99,
        "Price Max" : 3.19,
        "Citrus Circus" : 1.09
    }
}

y otro para plantanos

{
    "_id" : "bc2a41170621c326ec68382f846d5764",
    "_rev" : "2612672603",
    "item" : "banana",
    "prices" : {
        "Fresh Mart" : 1.99,
        "Price Max" : 0.79,
        "Banana Montana" : 4.22
    }
}

Ahora si se puede crear un view con Futon, para ello primero dar click en hello-world

Dar click en Temporaly view de la opción View para crear un nuevo view, ahora se debería de ver una ventana a la izquierda mostrando el contenido de la función map y a la derecha el contenido de la función reduce.

En la función map debe contener el codigo siguiente

function(doc) {
    var shop, price, value;
    if (doc.item && doc.prices) {
        for (shop in doc.prices) {
            price = doc.prices[shop];
            value = [doc.item, shop];
            emit(price, value);
        }
    }
}

Estas función será ejecutada para cada uno de nuestros documentos para calcular el view, de momento la función reduce queda en blanco.

Para ejecutar el view se presiona el botón Run y en la parte inferior se observa el resultado de la ejecución

5.99                                   	["apple", "Price Max"]
ID: 6a11afd1a12ed064e79d2cb7cc001f99
4.22                                   	["banana", "Banana Montana"]
ID: 6a11afd1a12ed064e79d2cb7cc005060
3.19                                   	["orange", "Price Max"]
ID: bc2a41170621c326ec68382f846d5764
1.99                                   	["orange", "Fresh Mart"]
ID: bc2a41170621c326ec68382f846d5764
1.99                                   	["banana", "Fresh Mart"]
ID: 6a11afd1a12ed064e79d2cb7cc005060
1.59                                   	["apple", "Fresh Mart"]
ID: 6a11afd1a12ed064e79d2cb7cc001f99
1.09                                   	["orange", "Citrus Circus"]
ID: bc2a41170621c326ec68382f846d5764
0.79                                   	["banana", "Price Max"]
ID: 6a11afd1a12ed064e79d2cb7cc005060
0.79                                   	["apple", "Apples Express"]
ID: 6a11afd1a12ed064e79d2cb7cc001f9

El resultado incluye todos los items ordenados por precio, esto sería más funcional si la función map agrupara por items por tipo, asi que todos los precios de naranja estubieran juntos.

En CouchDB el systema de ordenación permite cualquier objeto válido en JSON como valor de llave, en este se necesita emitir un arreglo [item, price] para que CouchDB pueda agruparlos por el tipo de item y precio.

Las función map modificada es la siguiente

function(doc) {
    var shop, price, key;
    if (doc.item && doc.prices) {
        for (shop in doc.prices) {
            price = doc.prices[shop];
            key = [doc.item, price];
            emit(key, shop);
        }
    }
}

Se da click en el botón Run para obtener los resultados y se puede observar que ahora están agrupados por tipo de item.

Finalmente se realizará una replicación de la base de datos hello-world

Se crea una nueva base de datos hello-replication, luego dar click en la opción Replicator en el menu lateral y seleccionar la base fuente y destion, dar click en el botón Replicate

Se observará el resultado de las acción realizada, se puede entrar ahora a la base hello-replication y se podrá observar los documento creados en la base hello-world.

El proceso de replicación puede tomar mucho más tiempo para bases de datos más grandes, así que es necesario dejar abierta la ventana del navegador hasta que termine la replicación, de lo contrario se cancelará y será necesario reiniciar la replicación nuevamente; afortunadamente CouchDB continuará la replicación en el punto donde fué cancelada.

Pues esto es todo de Iniciando con noSQL

Lo que sigue es crear una aplicación

Categorías:SQL / noSQL Etiquetas: , , ,
  1. Aún no hay comentarios.
  1. No trackbacks yet.

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

PiKon

3D Printing + Raspberry Pi Camera = PiKon Telescope

gvSIG blog

gvSIG project blog

Python Adventures

Welcome to the Jungle!

A %d blogueros les gusta esto: