Introduction to couchdb

Post on 11-May-2015

3.121 views 0 download

description

Introduction to couchdb

Transcript of Introduction to couchdb

Introduction to CouchDB

Jon Allen (JJ)

http://perl.jonallen.info - jj@jonallen.info

perl.jonallen.info

What is CouchDB?

•  Document Oriented Database

Introduction to CouchDB

perl.jonallen.info

What is CouchDB?

•  Document Oriented Database –  No schema

• Stores "documents" (i.e. data structures)

–  No SQL • Uses MapReduce queries written in JavaScript

Introduction to CouchDB

perl.jonallen.info

What is CouchDB?

•  Document Oriented Database –  No schema

• Stores "documents" (i.e. data structures)

–  No SQL • Uses "MapReduce" queries written in JavaScript

•  Written in Erlang

•  REST API •  Replication, scalability

Introduction to CouchDB

perl.jonallen.info

Why use CouchDB?

•  Store complex data structures (JSON) •  Store variable data structures (no schema) •  De-normalised / self contained •  Add attachments to documents

•  Scalable and fault tolerant

•  Better fit for certain problem domains –  Messaging –  CMS

Introduction to CouchDB

perl.jonallen.info

Using CouchDB from Perl

•  HTTP REST API •  No DBI, DBD, DBIx::Class etc

•  CPAN modules –  CouchDB::Client –  AnyEvent::CouchDB

Introduction to CouchDB

perl.jonallen.info

Creating a database

Introduction to CouchDB

use CouchDB::Client; use Try::Tiny;

my $client = CouchDB::Client->new( uri => 'http://localhost:5984' );

my $db = $client->newDB('jj_test'); # lower case!

try { $db->create; } catch { die "Could not create DB"; };

perl.jonallen.info

Inserting a document

Introduction to CouchDB

my $client = CouchDB::Client->new(); my $db = $client->newDB('jj_test');

my $doc = $db->newDoc('docid', undef, { type => 'message', text => 'Hello, World', to => ['JJ', 'Barbie', 'Brian'], });

try { $doc->create; } catch { die "Could not create document"; };

perl.jonallen.info

Inserting a document

Introduction to CouchDB

my $client = CouchDB::Client->new(); my $db = $client->newDB('jj_test');

my $doc = $db->newDoc('docid', undef, { type => 'message', text => 'Hello, World', to => ['JJ', 'Barbie', 'Brian'], });

try { $doc->create; } catch { die "Could not create document"; };

Document ID, must be unique

Revision ID

perl.jonallen.info

CouchDB GUI

Introduction to CouchDB

perl.jonallen.info

Querying documents

Introduction to CouchDB

Map function

Key, Value

Key, Value

Key, Value

Key, Value

All Documents

Query by Key Key, Value

Key, Value

perl.jonallen.info

Views

•  A view is a JavaScript function –  Like a stored procedure in SQL

•  Map function is executed on every document in the database

•  Emits key/value pairs –  Can emit 0, 1, or more KV pairs for each document in the

database –  Keys and values can be complex data structures

•  KV pairs are then ordered and indexed by key

Introduction to CouchDB

perl.jonallen.info

Queries

•  Queries are run against views –  i.e. searches the "key" of the list of KV pairs

•  Query types: –  Exact: key = x

–  Range: key is between x and y

–  Multiple: key is in list (x,y,z)

•  Reduce functions –  e.g. count, sum, group

Introduction to CouchDB

perl.jonallen.info

Designing a view

•  Show messages for a specific user

Introduction to CouchDB

my $view = <<EOT; function(doc) { if (doc.type && doc.to && doc.text) { if (doc.type == 'message') { for (var dest in doc.to) { emit(doc.to[dest], doc.text); } } } } EOT

perl.jonallen.info

Creating a view

Introduction to CouchDB

my $client = CouchDB::Client->new(); my $db = $client->newDB('jj_test');

my $doc = $db->newDesignDoc('_design/myview',undef, { views => { messages_to => { map => $view }, }, });

try { $doc->create; } catch { die "Could not create document"; };

perl.jonallen.info

Querying a view

Introduction to CouchDB

use Data::Dumper; my $client = CouchDB::Client->new(); my $db = $client->newDB('jj_test');

my $view = $db->newDesignDoc('_design/myview')->retrieve;

my $result = try { $view->queryView('messages_to', (key => 'JJ')); } catch { die "Could not query view"; };

say Dumper($result);

perl.jonallen.info

Query results

Introduction to CouchDB

varos:talk_scripts jj$ perl5.10.1 query_view.pl

$VAR1 = { 'total_rows' => 3, 'rows' => [ { 'value' => 'Hello, World', 'id' => 'docid', 'key' => 'JJ' } ], 'offset' => 2 };

perl.jonallen.info

Conclusion

•  Different mindset to SQL database •  Quite low-level, but very powerful •  Additional features

–  Replication

–  Document revisions –  Reduce functions

–  Changes API

•  More information: http://books.couchdb.org/relax

Introduction to CouchDB

perl.jonallen.info Introduction to CouchDB

KTHKSBYE!

Thank you for listening!

Any questions?

http://perl.jonallen.info/talks