ClojureのWebアプリのJSONストレージとしてRethinkDBを使ってみようと思います。まずは何も考えずにさくっとDockerで起動してみます。30秒でできるQuick Startとやってみる気になります。developer friendlyを謳うだけのことがありドキュメントサイトがとても充実しています。
Dockerイメージ
RethinkDBにはオフィシャルイメージがあります。latestのバージョンは2.0.2
でした。
Docker Hubからイメージをpullしてからカレントディレクトリにデータボリュームをマップしてrunします。
$ mkdir ~/rethinkdb_apps
$ cd !$
$ docker pull rethinkdb
$ docker run --name rethinkdb -v "$PWD:/data" -d rethinkdb
起動に成功しました。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8ab92f373592 rethinkdb:latest "rethinkdb --bind al 8 seconds ago Up 7 seconds 8080/tcp, 28015/tcp, 29015/tcp rethinkdb
ngrok
今回はお試しなのでngrokでトンネルしてクラウドで動かしているDockerコンテナにローカルから接続します。
inspectしてコンテナのIPアドレスを確認します。
$ RETHINK_IP=$(docker inspect --format={{ .NetworkSettings.IPAddress }}" rethinkdb)
$ echo $RETHINK_IP
172.17.0.249
ngrokのイメージをpullして起動します。トンネルしてアクセスできるランダムなURLを生成してくれます。
$ docker pull wizardapps/ngrok
$ docker run -it --rm wizardapps/ngrok:latest ngrok $RETHINK_IP:8080
ngrok (Ctrl+C to quit)
Tunnel Status online
Version 1.7/1.7
Forwarding http://3e826126.ngrok.com -> 172.17.0.251:8080
Forwarding https://3e826126.ngrok.com -> 172.17.0.251:8080
Web Interface 0.0.0.0:4040
# Conn 0
Avg Conn Time 0.00ms
30秒でできるQuick Start
Thirty-second quickstart with RethinkDBのページをみながらRethinkDBを触ってみます。
ngrokがトンネルしてくれるURLにブラウザでアクセスします。
シンプルできれいなUIの管理画面です。
テーブルの作成
Data Exploler
画面に移動します。上のテキストエリアにテーブルを作成するコードを入力します。RunボタンまたはShift+Enter
キーを押すと実行されます。
r.db('test').tableCreate('tv_shows')
Tree View
にJSON形式で処理結果が表示されました。
{
"config_changes": [
{
"new_val": {
"db": "test",
"durability": "hard",
"id": "25206b5d-3b66-4a48-b99f-16c8b74b418d",
"name": "tv_shows",
"primary_key": "id",
"shards": [
{
"primary_replica": "8ab92f373592_i07",
"replicas": [
"8ab92f373592_i07"
]
}
],
"write_acks": "majority"
},
"old_val": null
}
],
"tables_created": 1
}
レコードの登録
作成したtv_shows
テーブルにレコードを2件登録します。一度のinsert関数で複数件の登録ができます。
r.table('tv_shows').insert([{ name: 'Star Trek TNG', episodes: 178 },
{ name: 'Battlestar Galactica', episodes: 75 }])
Tree View
にinsertの結果が表示されます。
{
"deleted": 0,
"errors": 0,
"generated_keys": [
"834b3df0-d49b-4159-a202-d23d2c60c1eb",
"73d5d449-d8cf-4b5a-b016-fff4152d787d"
],
"inserted": 2,
"replaced": 0,
"skipped": 0,
"unchanged": 0
}
レコードのカウントとクエリ
count()でカウントします。
r.table('tv_shows').count()
結果はinsertしたレコード数の2です。
2
フィルタに条件を指定してクエリします。
r.table('tv_shows').filter(r.row('episodes').gt(100))
episodes
のフィールドが100より大きい条件なので該当は1件です。
{
"episodes": 178,
"id": "834b3df0-d49b-4159-a202-d23d2c60c1eb",
"name": "Star Trek TNG"
}
Raw view
のタブに切り換えると表形式で見やすく表示してくれます。