Introduction to couchdb

19

Click here to load reader

description

Introduction to couchdb

Transcript of Introduction to couchdb

Page 1: Introduction to couchdb

Introduction to CouchDB

Jon Allen (JJ)

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

Page 2: Introduction to couchdb

perl.jonallen.info

What is CouchDB?

•  Document Oriented Database

Introduction to CouchDB

Page 3: 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

Page 4: 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

Page 5: 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

Page 6: 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

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

Page 8: Introduction to couchdb

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 couchdb

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 couchdb

perl.jonallen.info

CouchDB GUI

Introduction to CouchDB

Page 11: 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

Page 12: Introduction to couchdb

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

Page 14: 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

Page 15: Introduction to couchdb

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 couchdb

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 couchdb

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 couchdb

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 couchdb

perl.jonallen.info Introduction to CouchDB

KTHKSBYE!

Thank you for listening!

Any questions?

http://perl.jonallen.info/talks