Slide 1

Slide 1 text

RethinkDB a primer

Slide 2

Slide 2 text

What is RethinkDB? An open-source distributed database built with . "MongoDB with joins"

Slide 3

Slide 3 text

Features JSON data model Distributed joins, subqueries, aggregation and atomic updates Hadoop-style map/reduce Friendly web and command-line administration tools Multi-datacenter replication and failover Sharding and replication Queries are automatically parallelized and distributed

Slide 4

Slide 4 text

Getting Started

Slide 5

Slide 5 text

Installation tyrion@kings-landing:~$ brew update tyrion@kings-landing:~$ brew install rethinkdb

Slide 6

Slide 6 text

Set Up tyrion@kings-landing:~$ rethinkdb

Slide 7

Slide 7 text

Web UI

Slide 8

Slide 8 text

Clustering tyrion@kings-landing:~$ rethinkdb create –d /tmp/db1 tyrion@kings-landing:~$ rethinkdb –j –d /tmp/db1 --port-offset 1

Slide 9

Slide 9 text

Clustering

Slide 10

Slide 10 text

Clustering

Slide 11

Slide 11 text

Gem tyrion@kings-landing:~$ gem install rethinkdb [1] pry(main)> require "rethinkdb" [2] pry(main)> include RethinkDB::Shortcuts [3] pry(main)> r.connect(host: 'localhost', database: 'marvel').repl()

Slide 12

Slide 12 text

Working with RethinkDB

Slide 13

Slide 13 text

Get All [1] pry(main)> r.table('characters').run

Slide 14

Slide 14 text

Get Document [1] pry(main)> r.table('characters').get(1).run

Slide 15

Slide 15 text

Filter [1] pry(main)> r.table('characters').filter({ age: 30 }).run

Slide 16

Slide 16 text

Update [1] pry(main)> r.table('characters').get(1).update({ age: 50}).run

Slide 17

Slide 17 text

Delete [1] pry(main)> r.table('characters').get(1).delete.run

Slide 18

Slide 18 text

ReQL

Slide 19

Slide 19 text

Principles 1. ReQL embeds into your programming language. 2. All ReQL queries are chainable. 3. All queries execute on the server.

Slide 20

Slide 20 text

Embeds into your Language [1] pry(main)> require "rethinkdb" [2] pry(main)> include RethinkDB::Shortcuts [3] pry(main)> r.connect(host: 'localhost', database: 'marvel').repl() [1] pry(main)> r.table('characters').get(1).delete.run

Slide 21

Slide 21 text

Chainable Queries [1] pry(main)> r.table('characters').run [2] pry(main)> r.table('characters').pluck('last_name').distinct().run [3] pry(main)> r.table('characters').pluck('last_name').distinct().count().run

Slide 22

Slide 22 text

Server-Side Execution [1] pry(main)> query = r.table('characters').pluck('last_name').distinct [2] pry(main)> query.run

Slide 23

Slide 23 text

Examples

Slide 24

Slide 24 text

Filter + Contains [1] pry(main)> r.table('user').filter{|user| user['emails'].contains('[email protected]')}.run

Slide 25

Slide 25 text

Filter Dates [1] pry(main)> r.table("posts").filter{ |post| [2] pry(main)> post.during(r.time(2012, 1, 1, 'Z'), r.time(2013, 1, 1, 'Z')) [3] pry(main)> }.run

Slide 26

Slide 26 text

Filter + Pluck + Order + Limit [1] pry(main)> r.table('snippets'). [1] pry(main)* filter({lang: 'ruby'}). [1] pry(main)* pluck('id', 'title', 'created_at'). [1] pry(main)* order_by(r.desc('created_at')). [1] pry(main)* limit(10). [1] pry(main)* run()

Slide 27

Slide 27 text

Group + Merge [1] pry(main)> r.table('invoices').group( [1] pry(main)* [r.row['date'].year(), r.row['date'].month()] [1] pry(main)* ).ungroup().merge( [1] pry(main)* {invoices: r.row['reduction'], month: r.row['group']} [1] pry(main)* ).without('reduction', 'group').order_by('month').run

Slide 28

Slide 28 text

Cool Features

Slide 29

Slide 29 text

Geospatial [1] pry(main)> point1 = r.point(-122.423246,37.779388) [2] pry(main)> point2 = r.point(-117.220406,32.719464) [3] pry(main)> r.distance(point1, point2, {:unit => 'm'}).run [4] pry(main)> r.circle(point1, 2000).includes(point2).run

Slide 30

Slide 30 text

HTTP [1] pry(main)> r.table('comics').insert(r.http('http://foo.com/comics')).run

Slide 31

Slide 31 text

Changes [1] pry(main)> r.table('games').changes().run.each{|change| p change}

Slide 32

Slide 32 text

No content