Open Source Business Systems www.opusvl.com Introduction to CouchDB Jon Allen (JJ) – [email protected] YAPC::Europe 2010 Introduction to CouchDB
Nov 28, 2014
Open Source Business Systems www.opusvl.com
Introduction to CouchDB
Jon Allen (JJ) – [email protected]
YAPC::Europe 2010
Introduction to CouchDB
Open Source Business Systems www.opusvl.com
What is CouchDB?
• Document Oriented Database
Introduction to CouchDB
Open Source Business Systems www.opusvl.com
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
Open Source Business Systems www.opusvl.com
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
Open Source Business Systems www.opusvl.com
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
Open Source Business Systems www.opusvl.com
Using CouchDB from Perl
• HTTP REST API • No DBI, DBD, DBIx::Class etc
• CPAN modules – CouchDB::Client – AnyEvent::CouchDB
Introduction to CouchDB
Open Source Business Systems www.opusvl.com
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"; };
Open Source Business Systems www.opusvl.com
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"; };
Open Source Business Systems www.opusvl.com
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
Open Source Business Systems www.opusvl.com
CouchDB GUI
Introduction to CouchDB
Open Source Business Systems www.opusvl.com
Querying documents
Introduction to CouchDB
Map function
Key, Value
Key, Value
Key, Value
Key, Value
All Documents
Query by Key Key, Value
Key, Value
Open Source Business Systems www.opusvl.com
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
Open Source Business Systems www.opusvl.com
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
Open Source Business Systems www.opusvl.com
Designing a view
• Show messages for a specific user
Introduction to CouchDB
// This is JavaScript
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); } } } }
Open Source Business Systems www.opusvl.com
Creating a view
• Can either use the GUI or the API
• View stored in database as a "Design Document" – A design document can contain multiple views
• Example – Design document "_design/myview" – View name "messages_to"
Introduction to CouchDB
Open Source Business Systems www.opusvl.com
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);
Open Source Business Systems www.opusvl.com
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 };
Open Source Business Systems www.opusvl.com
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
Open Source Business Systems www.opusvl.com
KTHKSBYE!
Introduction to CouchDB
Thank you for listening!
Any questions?
http://www.opusvl.com
http://perl.jonallen.info/talks