🤖

Firestore データベースを複数作成できる機能が GA になった

2024/01/23に公開

こんにちは、フロントエンドエンジニアの雪村です。

Firestore について、プロジェクトごとに複数のデータベースを作成する機能が GA になりました。
簡単に複数のデータベースを作成し、ウェブクライアントライブラリを使ってデータの取得ができたのでご紹介します。

詳細な情報は公式ドキュメントをご覧ください。

利用想定

1 つのプロジェクトで複数の Firestore のデータベースを使用する想定として、公式ドキュメントには以下のようなパターンが挙げられています。

  1. 本番環境とテスト環境の設定
  2. 顧客データの分離
  3. データのリージョン指定

(default) データベース

複数のデータベースが不要な場合は (default) データベースを使用することになります。
データベースを指定しない場合は (default) データベースに接続されるので、既存のシステムを変更する必要はありません。

無料の割り当ては (default) データベースのみに適用されるため、複数のデータベースが不要な場合はあえてデータベースを増やさない方が良いかと思います。

データベースの作成

Google Cloud コンソール から Firestore にアクセスします。(Firebase のコンソールではないことに注意)
「データベースを作成」をクリックします。
データベースを作成する

データベースの作成画面が表示されます。
Firestore のネイティブモードか、Datastore モードかを選択します。
データベースのモードを選択する

データベースの構成を設定します。
ロケーションタイプやセキュリティルールはご自身の環境に合わせて変更してください。
今回は簡単な検証なので、ロケーションに asia-northeast1(東京) リージョンを選択、セキュリティルールはテストルールを使用します。
データベースの構成を設定する

設定が終わったら「データベースを作成」をクリックして作成完了を待ちます。
データベースが作成されると、コンソールから確認することができます。
作成されたデータベースを確認する

今回はコンソールでデータベースの作成作業を行いましたが、gcloud コマンドや Firebase CLI 、Terraform での作成も可能です。

データの追加

データの追加は、今までとほとんど変わりません。

最初に データベースを選択する という手順が増えただけです。

データベース選択後は、今までと同様の手順でデータを追加します。
データを追加する

  • コレクション : test
  • ドキュメント ID : qTllKcZesblboK54SkTe
  • フィールド名 : message
  • フィールド値 : これは multi-database-1 データベースのメッセージです

追加したデータは各データベースから見ることができます。
データを確認する

データの閲覧について、Firebase コンソールでは (default) データベースしか見ることができません(2024年1月19日 現在)。

私は今まで Firebase 周りは Firebase コンソールから確認していたので、Firestore の操作のために Google Cloud コンソールを意識する必要がある、というのはまだ少し慣れません。修行します。

データの取得

作成したデータベースからデータを取得してみましょう。
今回はウェブクライアントライブラリを使用してデータを取得する方法についてご紹介します。

データの準備

準備としてデータをもう一つ用意しておきます。

(default) データベースに、先ほど新規作成したデータベースに追加したデータと 「コレクション」と「ドキュメント ID」、「フィールド名」が同じデータ を追加します。

(default) データベースにデータを追加する

  • コレクション : test
  • ドキュメント ID : qTllKcZesblboK54SkTe
  • フィールド名 : message
  • フィールド値 : これは (default) データベースのメッセージです

フィールド値だけ変更しました。

2 つのデータベースに同じコレクション、ドキュメント ID のデータがあることを確認できたらデータの準備は完了です。

ウェブクライアントライブラリの使用

Firebase のウェブクライアントライブラリを使用します。
ライブラリのインストールをしておきます。

npm install firebase --save

データを取得するコード

先にコード全体を記載します。

main.js
import { initializeApp } from 'firebase/app';
import { getFirestore, doc, getDoc } from 'firebase/firestore/lite';

const firebaseConfig = {
  /**
   * ご自身の設定を入れてください
   */
};

const app = initializeApp(firebaseConfig);

// (default) データベースを使用する場合は データベース ID は省略可能
const defaultDb = getFirestore(app);

// 特定のデータベースを使用する場合は、Firestore のデータベース ID を指定
// 今回は multi-database-1 を設定
const multiDb = getFirestore(app, "multi-database-1");


// ドキュメントを取得してコンソールに出力
const getDocData = async (db, collection, documentId) => {
  const docRef = doc(db, collection, documentId);
  const docSnap = await getDoc(docRef);

  if (docSnap.exists()) {
    console.log(`${}`, "Document data:", docSnap.data());
  }else{
    console.log("No such document!");
  }
}

// default データベースからドキュメントを取得
getDocData(defaultDb, 'test', 'qTllKcZesblboK54SkTe');

// 新規作成したデータベースからドキュメントを取得
getDocData(multiDb, 'test', 'qTllKcZesblboK54SkTe');

データベースの初期化

複数データベースを扱う場合、それぞれのデータベースを初期化する必要があります。
getFirestore で Firestore データベースを初期化する時に、データベース ID を指定することで、特定のデータベースの初期化が可能です。
(default) データベースの場合は省略可能です。

// (default) データベースを使用する場合は データベース ID は省略可能
const defaultDb = getFirestore(app);

// 特定のデータベースを使用する場合は、Firestore のデータベース ID を指定
// 今回は multi-database-1 を設定
const multiDb = getFirestore(app, "multi-database-1");

各データベースからデータを取得

データベースの指定は、前述の初期化設定でのみ行うため、以降のデータ取得は今まで通りとなります。

// ドキュメントを取得してコンソールに出力
const getDocData = async (db, collection, documentId) => {
  const docRef = doc(db, collection, documentId);
  const docSnap = await getDoc(docRef);

  if (docSnap.exists()) {
    console.log("Document data:", docSnap.data());
  }else{
    console.log("No such document!");
  }
}

// default データベースからドキュメントを取得
getDocData(defaultDb, 'test', 'qTllKcZesblboK54SkTe');

// multi-database-1 データベースからドキュメントを取得
getDocData(multiDb, 'test', 'qTllKcZesblboK54SkTe');

node main.js で実行した結果がこちらです。

❯ node main.js
Document data: { message: 'これは (default) データベースのメッセージです' }
Document data: { message: 'これは multi-database-1 データベースのメッセージです' }

今回、同じコレクション、同じドキュメント ID でデータを作成しましたが、指定したデータベースが異なることで、取得したデータも異なることが分かります。

以上で、ウェブクライアントライブラリでも簡単に複数の Firestore データベースからデータを取得することができました!

触ってみた感想

個人の感想です。

良いなと思ったところ

  1. セキュリティルールの適用がしやすくなる(かも)
    まず、それぞれのデータベースに対してセキュリティルールを適用できるため、セキュリティルールが複雑化しすぎてルールに漏れが出てしまう、といった事態も回避できるのでは?と思いました。
    サブコレクションや権限によるアクセス制御をセキュリティルールで対応しようとすると、複雑になっていきます。
    データベースを分けることにより、シンプルなセキュリティルールを適用しやすくなるのはメリットかなと思います。
    セキュリティルールの検証も今後していきたいですね。

  2. 顧客データを分離できる
    今までの Firestore だと、顧客ごとにデータを分けたい場合はコレクションを分けるなどの対応になっていたかと思います。
    データベースごと分けることで、より安全に運用することができるのではないかと思います。

注意しないといけないなと思ったところ

  1. 無料割り当てがない
    これは仕方のないことですが、(default) データベース以外は無料の割り当てがありません。
    料金の試算をする際はご注意ください。

  2. Google Cloud コンソールと Firebase コンソール でできることが異なる
    (default) データベースのセキュリティルールは Firebase コンソールでのみ更新可能、新たに作成したデータベースは Google Cloud コンソールでのみ更新可能、などコンソール上でできることに差があります。
    今後、改善されたら嬉しいですね!!

おわりに

Firestore データベースを複数作成できる機能は、Firestore の可能性を大きく広げるものだと思います。
こういうところで使えるんじゃないかというアイディアがあれば、ぜひ教えてください!

Discussion