CouchDB
     relax
CouchDB
     relax
 Sander van de Graaf
      svdgraaf
RELAX...
PERFORM LIKE A PR0N STAR
TOPICS
• NoSQL

• CouchDB      in a nutshell
• Querying

• map/reduce

• Fulltext   search
• CouchApps
NOSQL
IT’S A MOVEMENT
1998
Carlo Strozzi
NOSQL == Not Only SQL
“[The NoSQL movement] departs from the relational
model altogether, it should therefore have been called
more appropriately ‘NoREL’, or something to that
effect.”
                                         - Carlo Strozzi
CouchDB
     relax
NUTSHELL
SPEED
APPEND ONLY
NO REPAIR NEEDED
COMPACTING
HTTP SERVER
CAP
CouchDB




 CAP
CouchDB




EVENTUALLY CONSISTENT
FULL REST API
REST
• GET        • SELECT

• PUT        • UPDATE

• POST       • INSERT

• DELETE     • DELETE

• COPY       • ...
JSON
{
    total_rows: 2,
    offset: 0,
    rows: [
        {
            id: '_design/foobar',
            key: '_design/foobar',
            value: { rev: '5-982b2fc36835715b2aae54609b5d5f1e' }
        },
        {
            id: 'f0e1fd96eb6e094f74dda8d949000a6a',
            key: 'f0e1fd96eb6e094f74dda8d949000a6a',
            value: { rev: '1-86bca407fce8234a63c90ff549b56b10' }
        },
    ]
}
REPLICATION
CouchDB
     relax
CouchDB
     relax
             CouchDB
                  relax
CouchDB
                  relax




CouchDB
     relax
             CouchDB
                  relax




             CouchDB
                  relax
CouchDB
     relax
             CouchDB
                  relax
CouchDB
                  relax




CouchDB
     relax




             CouchDB
                  relax
US   NL


              CouchDB
                   relax




CouchDB
     relax




              CouchDB
                   relax
Laptop   Desktop


                 CouchDB
                      relax




CouchDB
     relax    Phone


                 CouchDB
                      relax
P2P WEB
QUERYING
SELECT * FROM documents WHERE id = 123



          GET /documents/123
SELECT * FROM documents WHERE id = 123



          GET /documents/123
           PUT /documents/123
          POST /documents/123
         DELETE /documents/123
                  etc.
MAP/REDUCE
INPUT
      IP                 Bytes
212.122.174.13           18271
212.122.174.13           191726
212.122.174.13            198
 74.119.8.111            91272
 74.119.8.111             8371
212.122.174.13             43
MAPPER => REDUCER
      IP         Bytes
                 18271
                 191726
212.122.174.13
                  198
                   43
                 91272
 74.119.8.111
                  8371
AFTER REDUCE
      IP          Bytes



212.122.174.13   210238




 74.119.8.111    99643
MAP/REDUCE

SELECT COUNT(foo)
FROM documents
WHERE 1
GROUP BY foo;
MAP/REDUCE
MAP/REDUCE

function(doc) {
  emit(doc.foo, doc);
}
MAP/REDUCE
MAP/REDUCE

function(keys, values, rereduce) {
    return sum(values);
}
MAP/REDUCE
COUCHDB-LUCENE
http://github.com/rnewson/couchdb-lucene
CONFIG
[external]
fti=/path/to/python /path/to/couchdb-lucene/tools/couchdb-external-hook.py

[httpd_db_handlers]
_fti = {couch_httpd_external, handle_external_req, <<"fti">>}
http://127.0.0.1:5984> GET /foobar/_design/foobar
_DESIGN

{
    _id: '_design/foobar',
    _rev: '8-03a6bc983c721b1cc0ae4b461326bc31',
    language: 'javascript',
    views: {
        foo: { map: 'function(doc) {n emit(doc.foo,1);n}',
        reduce: 'function(keys, values, rereduce) {return sum(values);}' }
    }
}
_DESIGN

{
    _id: '_design/foobar',
    _rev: '8-03a6bc983c721b1cc0ae4b461326bc31',
    language: 'javascript',
    views: {
        foo: { map: 'function(doc) {n emit(doc.foo,1);n}',
        reduce: 'function(keys, values, rereduce) {return sum(values);}' }
    },
    fulltext: {
        by_subject: {
            index:"function(doc) { var ret=new Document(); ret.add
(doc.subject); return ret }"
        },
    }
}
_DESIGN

function(doc) {
    var ret=new Document();
    ret.add(doc.subject);
    return ret
}
_DESIGN

function(doc) {
  var result = new Document();
  result.add(doc.subject, {"field":"subject", "store":"yes"});
  result.add(doc.content, {"field":"subject"});
  result.add(new Date(), {"field":"indexed_at"});
  return result;
}
http://127.0.0.1:5984> GET /foobar/_fti/_design/foo/by_subject?q=foobar
http://127.0.0.1:5984> GET /foobar/_fti/_design/foo/by_subject?q=foobar
COUCHAPPS
http://github.com/couchapp/couchapp
“Distributed, scalable, web
   applications you say?
omgwtfbbq!?!1!!!11!1!eleven”
_attachments
CouchDB
                  relax




CouchDB
     relax




             CouchDB
                  relax
COUCHAPP PUSH HTTP://LOCALHOST:5984/MYDB
LISTS
http://127.0.0.1:5984> GET /relax/_design/relax/_list/posts/all/foobar
HTTP/1.1 200 OK
Vary: Accept
Transfer-Encoding: chunked
Server: CouchDB/0.11.0 (Erlang OTP/R13B)
Etag: "DZZ19EPLWLHI89K1FOW9DGFT5"
Date: Sun, 11 Jul 2010 09:55:42 GMT
Content-Type: text/html

<h1>ponies</h1><p>rock!</p>
CouchDB
     relax
CouchDB
     relax
COUCHDBX
http://janl.github.com/couchdbx/
Q?

Advanced CouchDB Rotterdam.rb July 2010