2. What is CouchDB?
• Document Oriented Database
Introduction to CouchDB
perl.jonallen.info
3. 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
4. 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
5. 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
6. 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
7. Creating a database
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";
};
Introduction to CouchDB
perl.jonallen.info
8. Inserting a document
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";
};
Introduction to CouchDB
perl.jonallen.info
9. Inserting a document
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 { Document ID, Revision ID
$doc->create; must be unique
} catch {
die "Could not create document";
};
Introduction to CouchDB
perl.jonallen.info
10. CouchDB GUI
Introduction to CouchDB
perl.jonallen.info
11. Querying documents
All Map function
Documents
Key, Value
Key, Value
Key, Value
Query by Key
Key, Value
Key, Value
Key, Value
Introduction to CouchDB
perl.jonallen.info
12. 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
13. 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
14. Designing a view
• Show messages for a specific user
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
Introduction to CouchDB
perl.jonallen.info
15. Creating a view
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";
};
Introduction to CouchDB
perl.jonallen.info
16. Querying a view
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);
Introduction to CouchDB
perl.jonallen.info
18. 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
19. KTHKSBYE!
Thank you for listening!
Any questions?
http://perl.jonallen.info/talks
Introduction to CouchDB
perl.jonallen.info