More Related Content Similar to CouchDB on Rails - RailsWayCon 2010 (20) More from Jonathan Weiss (20) CouchDB on Rails - RailsWayCon 20102. Who am I?
Working for Peritor in Berlin, Germany
Written, maintain, or involved in
Webistrano
Capistrano
SimplyStored
Happening
The great fire of London
http://github.com/jweiss
@jweiss
2
6. CouchDB
Build for the Web
Scales
Replication built-in
Embracing offline
Flexible schema – document DB
6
9. JSON Document
{
"_id": "BCCD12CBB",
"_rev": "1-AB764C",
"type": "person",
"name": "Darth Vader",
"age": 63,
"headware": ["Helmet", "Sombrero"],
"dark_side": true,
"weapons": {
"right_arm": "light_saber",
"left_arm": null
}
}
9
10. JSON Document
{
"_id": "BCCD12CBB",
"_rev": "1-AB764C",
"type": "person",
"name": "Darth Vader",
"age": 63,
"headware": ["Helmet", "Sombrero"],
"dark_side": true,
"weapons": {
"right_arm": "light_saber",
"left_arm": null
}
}
10
11. JSON Document
{
"_id": "BCCD12CBB",
"_rev": "1-AB764C",
"type": "person",
"name": "Darth Vader",
"age": 63,
"headware": ["Helmet", "Sombrero"],
"dark_side": true,
"weapons": {
"right_arm": "light_saber",
"left_arm": null
}
}
11
14. Manual Namespacing
{
"_id": "BCCD12CBB",
"_rev": "1-AB764C",
"type": "person",
"name": "Darth Vader",
"age": 63,
"headware": ["Helmet", "Sombrero"],
"dark_side": true,
"weapons": {
"right_arm": "light_saber",
"left_arm": null
}
}
14
19. Design Document
{
"id": "_design/hats”,
"_rev": "431212AB4”,
"language": "javascript”,
"views": {
"all": {
"map": "function(doc){ .... }”,
"reduce": "function(doc){ .... }”
},
"by_manufacturer": {
"map": "function(doc){ .... }”,
"reduce": "function(doc){ .... }”
}
}
} 19
20. Design Document
{ Document ID
"id": "_design/hats”, –
"_rev": "431212AB4”, prefixed by “_design/”
"language": "javascript”,
"views": {
"all": {
"map": "function(doc){ .... }”,
"reduce": "function(doc){ .... }”
},
"by_manufacturer": {
"map": "function(doc){ .... }”,
"reduce": "function(doc){ .... }”
}
}
} 20
21. Design Document
{
"id": "_design/hats”,
"_rev": "431212AB4”,
"language": "javascript”,
"views": {
"all": { Hash of Views
"map": "function(doc){ .... }”,
"reduce": "function(doc){ .... }”
},
"by_manufacturer": {
"map": "function(doc){ .... }”,
"reduce": "function(doc){ .... }”
}
}
} 21
22. Design Document
{
"id": "_design/hats”,
"_rev": "431212AB4”,
"language": "javascript”,
"views": {
"all": { Hash of Views
"map": "function(doc){ .... }”, Every view has map &
"reduce": "function(doc){ .... }” reduce function
},
"by_manufacturer": {
"map": "function(doc){ .... }”,
"reduce": "function(doc){ .... }”
}
}
} 22
23. Map
function(doc) {
if (doc.headware) {
for (var hat in doc.headware) {
emit(hat, 1);
}
}
}
23
24. Map
Passed every
document in the DB
function(doc) {
if (doc.headware) {
for (var hat in doc.headware) {
emit(hat, 1);
}
}
}
24
25. Map
function(doc) {
if (doc.headware) {
Inspects
for (var hat in doc.headware) { & Decides
emit(hat, 1);
}
}
}
25
26. Map
function(doc) {
if (doc.headware) {
for (var hat in doc.headware) {
emit(hat, 1);
}
} Emits result
} for index
26
28. Reduce
Passed map result
(or partial reduce result)
function(keys, values, rereduce) {
return sum(values);
}
28
30. Example Map Result
Map functions are similar to SQL indices
ID KEY VALUE
51ABFA211 Cap 1
ABC123456 Cappy 1
BCCD12CBB Helmet 1
BCCD12CBB Sombrero 1
Sorted by the key
Key can also be an array
Value can be complex JSON
30
31. Query a view
GET /dbname/_design/hats/_view/all
HTTP Client
{"total_rows":348,"offset":0,"rows”:[
{"id":"A","key":"A","value":1},
{"id":"B","key":"B","value":1},
]}
31
32. Query a view
GET /dbname/_design/hats/_view/all?
include_docs=true
HTTP Client
32
33. View Query
Filter by
key=ABC123
startkey=123 & endkey=9
limit=100
descending=true
group=true
reduce=true
Include_docs=true
33
36. SimplyStored
Convenience Layer for CouchDB
Models & Associations
Validations
Callbacks BSD-licensed on
Dynamic finder http://github.com/peritor/simply_stored
S3 attachments On top of CouchPotato, CouchRest & RestClient
Paranoid delete
ActiveModel compliant
36
41. RockingChair
In-memory CouchDB
Just a big Hash
Understands all SimplyStored generated views
Speeds up tests
Tests can run in parallel
Nice for debugging
BSD-licensed on
http://github.com/jweiss/rocking_chair
41
46. CouchDB Replication
POST /_replicate
POST /_replicate
Eventually consistent & conflict resolution
46
53. Q&A
Peritor GmbH
Blücherstr. 22, Hof III Aufgang 6
10961 Berlin
Tel.: +49 (0)30 69 20 09 84 0
Fax: +49 (0)30 69 20 09 84 9
Internet: www.peritor.com
E-Mail: info@peritor.com
© Peritor GmbH - Alle Rechte vorbehalten