More Related Content Similar to CouchDB on Rails (20) More from Jonathan Weiss (20) CouchDB on Rails2. 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