Top Banner
Introduction to CouchDB Jon Allen (JJ) http://perl.jonallen.info - [email protected]
19
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Introduction to couch_db

Introduction to CouchDB

Jon Allen (JJ)

http://perl.jonallen.info - [email protected]

Page 2: Introduction to couch_db

perl.jonallen.info

What is CouchDB?

• Document Oriented Database

Introduction to CouchDB

Page 3: Introduction to couch_db

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

Page 4: Introduction to couch_db

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

Page 5: Introduction to couch_db

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

Page 6: Introduction to couch_db

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

Page 7: Introduction to couch_db

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

Page 8: Introduction to couch_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";};

Page 9: Introduction to couch_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";};

Document ID, must be unique

Revision ID

Page 10: Introduction to couch_db

perl.jonallen.info

CouchDB GUI

Introduction to CouchDB

Page 11: Introduction to couch_db

perl.jonallen.info

Querying documents

Introduction to CouchDB

Map function

Key, Value

Key, Value

Key, Value

Key, Value

All Documents

Query by KeyKey, Value

Key, Value

Page 12: Introduction to couch_db

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

Page 13: Introduction to couch_db

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

Page 14: Introduction to couch_db

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

Page 15: Introduction to couch_db

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

Page 16: Introduction to couch_db

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

Page 17: Introduction to couch_db

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

Page 18: Introduction to couch_db

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

Page 19: Introduction to couch_db

perl.jonallen.infoIntroduction to CouchDB

KTHKSBYE!

Thank you for listening!

Any questions?

http://perl.jonallen.info/talks