CouchDB

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

couchdb és una base de dades diferent, orientada a url.

Començant a treballar

$ sudo apt-get install couchdb

Com a eina interactiva per treballar amb couchdb des de la consola utilitzarem curl

$ sudo apt-get install curl
DESCRIPTION
       curl  is  a tool to transfer data from or to a server, using one of the
       supported protocols (HTTP, HTTPS, FTP, FTPS,  SCP,  SFTP,  TFTP,  DICT,
       TELNET,  LDAP  or  FILE).  The command is designed to work without user
       interaction.

Suposo que també valdria utilitzar directament wget.

Primer de tot, assegurem-nos de què couchdb està engegat:

$ curl http://127.0.0.1:5984/
{"couchdb":"Welcome","version":"0.10.0"}

En canvi, si utilitzo wget, el que es fa és obtenir el fitxer index.html que conté aquesta informació. L'altra possibilitat, és clar, és utilitzar directament el Firefox.

Per llistar totes les bases de dades:

$ curl -X GET http://127.0.0.1:5984/_all_dbs
["tweets-public-timeline"]

La BD tweets-public-timeline l'ha creat l'exemple amb què estava treballant (API de Twitter)

L'opció -X representa un Request HTTP. Hi ha varies opcions: GET, POST, PUT, DELETE:

       -X/--request <command>
              (HTTP) Specifies a custom request method to use when communicat‐
              ing  with  the  HTTP server.  The specified request will be used
              instead of the method otherwise used (which  defaults  to  GET).
              Read  the  HTTP  1.1 specification for details and explanations.
              Common additional HTTP requests  include  PUT  and  DELETE,  but
              related technologies like WebDAV offers PROPFIND, COPY, MOVE and
              more.

              (FTP) Specifies a custom FTP command to use instead of LIST when
              doing file lists with FTP.

              If this option is used several times, the last one will be used.

Creem una base de dades:

$ curl -X PUT http://127.0.0.1:5984/baseball
{"ok":true}

$ curl -X GET http://127.0.0.1:5984/_all_dbs
["tweets-public-timeline","baseball"]
We should mention JavaScript Object Notation (JSON) here, the data format CouchDB speaks. JSON is a lightweight data interchange format based on JavaScript syntax. Because JSON is natively compatible with JavaScript, your web browser is an ideal client for CouchDB.

Brackets ([]) represent ordered lists, and curly braces ({}) represent key/value dictionaries. Keys must be strings, delimited by quotes ("), and values can be strings, numbers, booleans, lists, or key/value dictionaries. For a more detailed description of JSON, see Appendix E, JSON Primer. 
$ curl -X PUT http://127.0.0.1:5984/baseball
{"error":"file_exists","reason":"The database could not be created, the file already exists."}

$ curl -X PUT http://127.0.0.1:5984/plankton
{"ok":true}

$ curl -X DELETE http://127.0.0.1:5984/plankton
{"ok":true}

Consola d'administració. Futon

Fins ara hem treballat en mode comanda amb curl. Ara bé, ja que couchdb està orientat a url, necessitem una manera de fer totes aquestes operacions des del Firefox. La consola d'administració web es diu Futon:

http://127.0.0.1:5984/_utils/

És interessant fer el Test Suite > Run All per comprovar que tot és correcte.

Amb Futon és fàcil crear una base de dades (creem la bd hello-world), i creem el primer document (a couchdb no hi ha taules, no és una base de dades relacional... no hi ha SQL... hi ha documents).

Es crea el _id de forma automàtica. Quan guardo el document, també es crea el camp de la revisió (_rev).

Per editar el Field o el Value, he de fer doble click. Per editar el Value, si és un string ho he de ficar entre doble cometes (format JSON). Amb la pestanua Source podem mirar el format JSON.

Query utilitzant MapReduce

La combinació de les funcions Map i Reduce es diu View/Vista en la terminologia de couchdb.

Let’s create documents for apples, oranges, and bananas. (Allow CouchDB to generate the _id and _rev fields.) Use Futon to create documents that have a final JSON structure that looks like this:

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

Per ficar el parell tipus de poma/preu correctament en format JSON he de ficar:

{"fresh mart": 1.59}

i per als tres tipus de pomes:

{
   "fresh mart": 1.59,
   "Price Max": 2.32,
   "Apple Express": 5.4
}

Anem a crear una vista, que mostri cada producte ordenat per preu.

Creo una Temporary View on la Map Function és:

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

i la Reduce Function la deixo buida. Estem executant una funció Javascript sobre cadascun dels documents.

i ara, si ho volem agrupar per productes, farem:

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

creat per Joan Quintana Compte, juliol 2011

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
IES Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines