Introduction to couch_db
-
Upload
romain-testard -
Category
Documents
-
view
1.056 -
download
4
Transcript of Introduction to couch_db
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 KeyKey, 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.infoIntroduction to CouchDB
KTHKSBYE!
Thank you for listening!
Any questions?
http://perl.jonallen.info/talks