【個人メモ】tiedotというNoSQL DBをいじってみる

# tiedot?

[tiedot](https://github.com/HouzuoGuo/tiedot)

Goで書かれたNoSQL DB。
触ってみるメモを書いとく。

# 環境

- Golangをインストール済みであること
- git, mercurialがインストール済みであること
- $GOPATH, $GOROOTが設定済みであること

# インストール方法

```
> go get github.com/HouzuoGuo/tiedot
```

# tiedotの立ち上げ

```
> tiedot -mode=httpd -dir=/tmp/MyDatabase -port=8080
```

# tiedot Web UI

Web UIが用意されている。admin画面を開いてみる

```
> open http://localhost:8080/admin
```

![Screen Shot 2014-10-07 at 22.26.39.png](https://qiita-image-store.s3.amazonaws.com/0/3985/b6605140-c96f-6738-c079-9de11be421b8.png)

## Web UIから操作をする

### コレクションとやらを作ってみよう。

![Screen Shot 2014-10-07 at 22.41.53.png](https://qiita-image-store.s3.amazonaws.com/0/3985/b3f3ea26-a077-0b81-54c7-ca8cd6009ee7.png)

"New Collection"ボタンをクリックして、
Modalの中にコレクション名を入れ、作成してみた。

![Screen Shot 2014-10-07 at 22.42.03.png](https://qiita-image-store.s3.amazonaws.com/0/3985/80d7cca5-73ba-62ca-4552-60447ae0c3fa.png)

### ドキュメントを作成

- "New Doc"を押してドキュメントを作る

![Screen_Shot_2014-10-07_at_22_48_06.png](https://qiita-image-store.s3.amazonaws.com/0/3985/1d89964f-286d-2dab-68e9-c0bddc1ea825.png)

- JSON形式でドキュメントを書いていく

![Screen Shot 2014-10-07 at 22.56.00.png](https://qiita-image-store.s3.amazonaws.com/0/3985/2c1f71af-ac93-7298-fd0c-7d8d2821ba1f.png)

- 新しいドキュメントがhogehogeコレクションに追加された。

![Screen Shot 2014-10-13 at 19.37.15.png](https://qiita-image-store.s3.amazonaws.com/0/3985/93113633-62c4-f0d5-5fb1-34e0e82e9453.png)

- コレクションのindex一覧画面にも、追加したドキュメントが表示されている

![Screen Shot 2014-10-13 at 19.38.35.png](https://qiita-image-store.s3.amazonaws.com/0/3985/cfc89e72-7725-14ab-2cf1-9139ce4877a8.png)

### 検索するためにindexを設定

クエリを投げるためにはindexを設定しなければいけないので、
indexを設定する。

![Screen_Shot_2014-10-13_at_21_26_14.png](https://qiita-image-store.s3.amazonaws.com/0/3985/052f8c52-5bd6-8a60-8b05-8da4132e1149.png)

- index追加

"New Index"ボタンを押す。

![Screen_Shot_2014-10-13_at_21_28_07.png](https://qiita-image-store.s3.amazonaws.com/0/3985/2683cf80-227b-1883-ad75-12ed7cf08795.png)

- modalにてindexに指定するキー名を入力する

![Screen Shot 2014-10-13 at 21.28.58.png](https://qiita-image-store.s3.amazonaws.com/0/3985/5460450b-ab57-87bb-3f29-31b8743e4053.png)

ドキュメントとして保存した時に利用したキー名である
**age**, **name**, **gadgets**を入力。

![Screen Shot 2014-10-13 at 21.33.23.png](https://qiita-image-store.s3.amazonaws.com/0/3985/b540c864-8bb5-4ff5-1808-354986fb5bb9.png)

### ドキュメントに保存した値をGUIで取得

#### **name=Keiji Matsuzaki** となるドキュメントがないか検索を行うクエリをGUIにて発行する

- ドキュメントの画面で"Query"ボタンを押す

![Screen_Shot_2014-10-13_at_21_35_23.png](https://qiita-image-store.s3.amazonaws.com/0/3985/51657196-8f57-3a21-a4fb-4a6ae3ec529b.png)

- 検索するクエリを書く

検索対象となるドキュメントは1件しか保存していないが、
クエリを書いてみることにする

```json
{ "eq": "Keiji Matsuzaki", "in": ["name"]}
```

- クエリの実行

![Screen Shot 2014-10-13 at 21.59.05.png](https://qiita-image-store.s3.amazonaws.com/0/3985/ca1303b8-b1b6-db20-d044-277fd9b5f36f.png)

"Execute" ボタンを押して、検索クエリに合うドキュメントがあれば、
ドキュメントが表示される。

- 無効なクエリを実行

検索に引っかからないクエリを発行した場合は、ドキュメントは出てこない。

![Screen Shot 2014-10-13 at 22.02.22.png](https://qiita-image-store.s3.amazonaws.com/0/3985/b972e972-b661-a7dc-aef7-688b28370bb0.png)

# CLIから操作

tiedotにはCLIからも操作が可能になるようにAPIが用意されている。
詳しくは、[API reference and embedded usage](https://github.com/HouzuoGuo/tiedot/wiki/API-reference-and-embedded-usage)を参考のこと。

## コレクションの作成

```
> curl "http://localhost:8080/create?col=hogehoge"
```

## コレクションが作られたか確認する

```
> curl "http://localhost:8080/all"
["hogehoge"]
```

## ドキュメントをコレクションに対して作成する

```
> curl --data-ascii \
  doc='{"name": "Keiji Matsuzaki", "age": 32, "gadgets": ["iPhone 6 Plus", "Nexus 7", "Mac Book Pro Retina Late 2012"]} \ 
  'http://localhost:8080/insert?col=hogehoge'
1652584854220917731
```

### 帰ってきたIDを元にドキュメントを検索

一意なIDが生成されるので、検索が容易。

```
> curl "http://localhost:8080/get?col=hogheoge&id=1652584854220917731"
{"age":32,"gadgets":["iPhone 6 Plus","Nexus 7","Mac Book Pro Retina Late 2012"],"name":"Keiji Matsuzaki"}
```

## 検索クエリを投げる

### indexを作成する

indexを作成しなければクエリを投げることができない。
**age**, **name**, **gadgets**のindexを作成する

```
> curl "http://localhost:8080/index?col=hogehoge&path=age"
> curl "http://localhost:8080/index?col=hogehoge&path=name"
> curl "http://localhost:8080/index?col=hogehoge&path=gadgets"
```

### クエリを投げる

- "name" = "Keiji Matsuzaki" なドキュメントを検索する

```
> curl --data-ascii \
  doc='{"name": "Keiji Matsuzaki", "in": ["name"]}' \
  http://localhost:8080/query?col=hogehoge'

{"1652584854220917731":{"age":32,"gadgets":["iPhone 6 Plus","Nexus 7","Mac Book Pro Retina Late 2012"],"name":"Keiji Matsuzaki"}}
```

## サーバのシャットダウンを行う

- /shutdown APIにアクセスすれば良い

```
> curl "http://localhost:8080/shutdown"
curl: (52) Empty reply from server
```

# 触ってみて

CouchDBの代わりになるのだろうか、とふと思ったり...
開発時のJSONでレスポンスを返すAPI サーバのモックアップとして利用できるんじゃないかなあ。