Cloud Firestore まとめ


概要

  • サーバーレスなKeyValueのデータストア
  • Cloud functionsから利用できる
  • クライアント側のアプリからも直接アクセスできる
    • セキュリティ設定に注意が必要
  • データの更新について、リアルタイムに通知が受け取れる

簡単なサンプル

CloudFirestoreからデータを取得する

import * as admin from 'firebase-admin';

const userId = 'test_user'

const user = (await admin
  .firestore()
  .collection('users')
  .doc(userId)
  .get()).data();

console.info(JSON.stringify(user));
  • firebase-adminを使用すると、Firestoreのアクセス制限の設定を無視してデータを取得できる
    • CloudFunctionsから利用するときはfirebase-adminを利用して、別途CloudFunctions側でアクセス制限する
  • CloudFunctionsからではなくクライアント側から直接Firestoreにアクセスするような時は、Firestoreのアクセス制限機能を利用する

CloudFirestoreへデータを設定する

import * as admin from 'firebase-admin';

const userId = 'test_user'

await admin
  .firestore()
  .collection('users')
  .doc(userId)
  .set({
    name: 'Test user',
    age: 23,
  });

気にするべき特徴

  • 1秒に1回しか更新できない
  • インデックスがないと検索できない
    • whereに入れるためには必ずインデックスが必要
    • 単一フィールドについてのインデックスは自動で作成してくれる
    • 複合フィールドについては自分で作る必要がある
      • なければ自動で作るためのURLをログに出してくれるので、そんなに面倒ではない
  • !=で検索できない
    • 国籍が日本以外のデータを検索、みたいなことができない
      • 他の国籍全てについて==で検索して、全ての結果をマージするしかない
  • 範囲検索が一つのフィールドにしか指定できない
    • 年齢xx歳以上、体重xx以上、のように複数の範囲条件が指定できない
      • 別々に検索してマージするしかない
    • orderByが範囲検索と捉えられるため、範囲検索が使えない場合も…
    • よくある「商品データベース」みたいなものに利用すると、検索できなくなって困ると思う
  • トランザクションがある
    • 既に他の誰かが編集中だったりすると失敗してリトライされる
  • 検索条件などに癖があるため、利用はきちんと検討してからにするべき

アクセス制限について

  • 制限内容は専用フォーマットの設定ファイル(rulesファイル)に記載する
  • アクセス制限のことを考えてデータ構造を設計しなくてはならない

データの項目にユーザーIDを入れておいてアクセス制限する例

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{uid} {
      allow list: if request.auth != null && (request.auth.uid == resource.data.uid)
    }
  }
}

グループに所属するユーザーのみにアクセスを許可する例

  • グループに所属しているかどうかを調べるのにwhere的に検索したいが、そのようなことはできない
  • 仕方ないのでコレクションキーuidにして、existsで調べる
service cloud.firestore {
  match /databases/{database}/documents {
    match /groups/{gid} {
      allow read: if request.auth != null && exists(/databases/$(database)/documents/groups/$(gid)/members/$(request.auth.uid));
    }
  }
}

参考サイト

目次