Firebase Cloud Firestoreを使ってみる

# はじめに

仕事仲間とサーバレスな話をしててFirebaseいろいろ無料ですげーみたいな話になった。AWS lambdaやAzure Functionsなんかでビジネスロジックをピタゴラスイッチしてユーザーに向けた出力を考えると、Firebaseは[ホスティング](https://firebase.google.com/products/hosting/?hl=ja)、[データストア](https://firebase.google.com/products/database/?hl=ja)、[Notification](https://firebase.google.com/docs/cloud-messaging/?hl=ja)とアプリに必要なものがタダ同然である。

最近Firebaseのことをみてなかったので久々に調べてたら[Cloud Firestore](https://firebase.google.com/docs/firestore/)という知らないやつがあったので使ってみることにした。

# Firebase Cloud Firestore

[Firestore](https://firebase.google.com/docs/firestore/)は[Realtime Database](https://firebase.google.com/docs/database/?hl=ja)と同様のデータベースサービス。Realtime DatabaseがJSONで構造化されたデータをストアするのに対し、Firestoreはドキュメント指向DBライクな階層型の構造化データをストアでき、クエリ処理が利用できる。MongoDBみたいな感じのDB。Realtime Databaseに比べてデータの抽出がカンタンにできそうな感じのもの。

2018.3.14 時点ではベータ版として提供されている。たぶん将来的にはRealtime Databaseを置き換えるものになるんだろう。

# つかってみる

[Quickstart](https://firebase.google.com/docs/firestore/quickstart)に沿ってnode.jsベースでやってみる。
まずは[Firebaseコンソール](https://console.firebase.google.com/)で新規プロジェクトを作成する。

![スクリーンショット 2018-03-14 22.51.32.png](https://qiita-image-store.s3.amazonaws.com/0/61995/968a1676-018f-887c-6b60-a62096177a7e.png)

適当に名前をつけて プロジェクトを作成 をクリックする。

![スクリーンショット 2018-03-14 22.52.20.png](https://qiita-image-store.s3.amazonaws.com/0/61995/2c90dc79-b890-fce5-ff47-91222b0e3e06.png)

次へ

![スクリーンショット 2018-03-14 22.53.25.png](https://qiita-image-store.s3.amazonaws.com/0/61995/bc80b6d4-3f14-5d7d-463d-b876fe507424.png)

Databaseをクリック

![スクリーンショット 2018-03-14 22.53.50.png](https://qiita-image-store.s3.amazonaws.com/0/61995/fee117cf-8fa6-5fee-db43-4a0976cf18de.png)

Firesotoreの 使ってみる をクリック

![スクリーンショット 2018-03-14 22.55.14.png](https://qiita-image-store.s3.amazonaws.com/0/61995/c56d247b-b23b-74ac-74c8-f18e088b72e1.png)

今回はテストモードを選択して 有効にする をクリックする

![スクリーンショット 2018-03-14 22.56.16.png](https://qiita-image-store.s3.amazonaws.com/0/61995/67026fc4-e9ba-08e1-ee6f-cf9bec94cbb0.png)

プロビジョニングが終了するとデータビューアーが表示される。

![スクリーンショット 2018-03-14 22.57.17.png](https://qiita-image-store.s3.amazonaws.com/0/61995/1d00ff50-9774-6760-ce3a-6828265b1ea9.png)

ローカルPCの適当な場所にサンプルプログラム用のディレクトリを作ってFirebase SDKをインストールする。

```
mkdir firestore-test && cd $_
npm init -f
npm install --save firebase-admin@^5.7.0
```

プロジェクトのダッシュボードから 歯車アイコン -> ユーザーと権限 をクリックする

![スクリーンショット 2018-03-14 23.32.42.png](https://qiita-image-store.s3.amazonaws.com/0/61995/c1868455-f9e1-c90c-e499-180bd70273dc.png)

左端のカギアイコンをマウスオーバーしてサービスアカウントをクリックする

![スクリーンショット 2018-03-14 23.34.06.png](https://qiita-image-store.s3.amazonaws.com/0/61995/b6f45b30-8c94-bff6-30a8-3159954e3b79.png)

サービスアカウントの画面でデフォルトで設定されているサービスアカウントの右端オプションアイコンから キーを作成 をクリックする

![スクリーンショット 2018-03-14 23.36.58.png](https://qiita-image-store.s3.amazonaws.com/0/61995/e67318ef-dcfb-3f42-5838-80902dc01325.png)

キーのタイプ JSON を選択し、作成をクリック

![スクリーンショット 2018-03-14 23.39.40.png](https://qiita-image-store.s3.amazonaws.com/0/61995/f9665c8c-df8a-4a1a-1329-8dbae22aa9ca.png)

サービスアカウントの秘密鍵が入ったJSONファイルがダウンロードされる。
このJSONファイルを先ほど作ったディレクトリに配置しておく。

下記のテストコードをディレクトリ下に作成する。`[SERVICE ACCOUNT JSON FILE]` の部分を先ほどダウンロードしたサービスアカウントのJSONファイル名に書き換える。

```index.js
const admin = require('firebase-admin');

var serviceAccount = require("./[SERVICE ACCOUNT JSON FILE]");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

var db = admin.firestore();

var docRef = db.collection('users').doc('alovelace');

var setAda = docRef.set({
    first: 'Ada',
    last: 'Lovelace',
    born: 1815
});
```

実行してみる

```
node index.js
```

正常に実行できたら、Firestoreのデータビューアーを見てみる。usersコレクションが追加されていて、コレクションにドキュメントが追加されている。

![スクリーンショット 2018-03-14 23.45.31.png](https://qiita-image-store.s3.amazonaws.com/0/61995/d54237c8-fb63-2a49-a187-515732e0d488.png)


`index.js` を以下のように更新する。

```index.js
const admin = require('firebase-admin');

var serviceAccount = require("./[SERVICE ACCOUNT JSON FILE]");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

var db = admin.firestore();

db.collection('users').get()
    .then((snapshot) => {
        snapshot.forEach((doc) => {
            console.log(doc.id, '=>', doc.data());
        });
    })
    .catch((err) => {
        console.log('Error getting documents', err);
    });
```

実行してみる

```
node index.js
alovelace => { last: 'Lovelace', first: 'Ada', born: 1815 }
```

usersコレクションのドキュメントが取得できた。

# まとめ

FirestoreはいまのところMongoDBのダイエット版といった感じか。単純なアプリで利用するデータストアとしては十分使えると思う。これでスケール気にせずに1GBまで無料か。やべえな。。上手く使ってなんか超節約Webサービス作ってみたい。