コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

ローカルで Firestore をエミュレートする

Google Cloud CLI には、アプリケーションのテストに使用できる Firestore 用のローカル インメモリ エミュレータが用意されています。エミュレータは、すべての Firestore クライアント ライブラリで使用できます。エミュレータは、ローカルテストでのみ使用してください。

本番環境のデプロイでは、エミュレータを使用しないでください。エミュレータはメモリ内にのみデータを保存するため、終了時にデータは失われます。

エミュレータをインストールする

Firestore エミュレータをインストールするには、gcloud CLI をインストールして更新します。

  1. gcloud CLI をインストールします

  2. gcloud インストールを更新して、最新の機能を取得します。

    gcloud components update
    

エミュレータを実行する

  1. 次のコマンドを実行して、エミュレータを起動します。

    gcloud emulators firestore start
    

    エミュレータによって、実行中のホストとポート番号が表示されます。

    デフォルトでは、エミュレータは localhost:8080 を使用しようとします。エミュレータを特定のホストとポートにバインドするには、オプションの --host-port フラグを使用し、HOSTPORT を置き換えます。

    gcloud emulators firestore start --host-port=HOST:PORT
    
  2. Control + C」と入力して、エミュレータを停止します。

エミュレータに接続する

エミュレータへの接続方法は、クライアント ライブラリのタイプ、サーバー クライアント ライブラリ、モバイル/ウェブ SDK によって異なります。

サーバー クライアント ライブラリ

Firestore サーバー クライアント ライブラリ(C#、Go、Java、Node.js、PHP、Python、Ruby)を接続するには、FIRESTORE_EMULATOR_HOST 環境変数を設定します。この環境変数を設定すると、サーバー クライアント ライブラリは自動的にエミュレータに接続します。

export FIRESTORE_EMULATOR_HOST="HOST:PORT"

Android、Apple プラットフォーム、ウェブの各 SDK

次の例は、Android、Apple プラットフォーム、ウェブ SDK を Firestore エミュレータに接続する方法を示しています。

Android
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.useEmulator("10.0.2.2", 8080);

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(false)
        .build();
firestore.setFirestoreSettings(settings);
Swift
let settings = Firestore.firestore().settings
settings.host = "localhost:8080"
settings.isPersistenceEnabled = false
settings.isSSLEnabled = false
Firestore.firestore().settings = settings

Web バージョン 9

import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";

// firebaseApps previously initialized using initializeApp()
const db = getFirestore();
connectFirestoreEmulator(db, 'localhost', 8080);

Web バージョン 8

// Firebase previously initialized using firebase.initializeApp().
var db = firebase.firestore();
if (location.hostname === "localhost") {
  db.useEmulator("localhost", 8080);
}

Firestore エミュレータは、シャットダウン時にデータベースのコンテンツをクリアします。Firestore SDK のオフライン キャッシュは自動的に消去されないため、エミュレートされたデータベースとローカル キャッシュの不一致を回避するよう、エミュレータ構成でローカル永続性を無効にすることもできます。Web SDK では、永続性はデフォルトで無効になっています。

エミュレータ データをクリアする

Firestore エミュレータには、現在エミュレータ内のすべてのデータを削除するための REST エンドポイントが含まれています。このエンドポイントを使用すると、エミュレータをシャットダウンせずに、テスト間でデータを消去できます。

エミュレータ内のすべてのデータを削除するには、次のエンドポイントに対して HTTP DELETE オペレーションを実行します。HOSTPORT は、選択したホストとポートに置き換え、PROJECT_ID は実際のプロジェクト ID に置き換えます。

http://HOST:PORT/emulator/v1/projects/PROJECT_ID/databases/(default)/documents

エミュレータが localhost:8080 を使用しない場合は、ホストとポートを調整します。コードは、削除が完了したか失敗したかを示す REST の確認を待つ必要があります。

この操作は curl を使用してシェルから実行できます。

$ curl -v -X DELETE "http://HOST:PORT/emulator/v1/projects/PROJECT_ID/databases/(default)/documents"

Firestore エミュレータと本番環境の違い

Firestore エミュレータは、本番環境サービスの動作を忠実に再現しようとしますが、いくつか注意が必要な制限事項があります。

トランザクション

エミュレータは、本番環境で発生するトランザクションの動作すべてを実装しているわけではありません。1 つのドキュメントに対して複数の書き込みが同時に実行される機能をテストする場合、エミュレータでは書き込みリクエストが完了するまで時間がかかることがあります。場合によっては、ロックが解除されるまでに最長で 30 秒かかります。必要に応じて、この問題に対応するように、テストのタイムアウトを調整することを検討してください。

インデックス

エミュレータは複合インデックスを追跡せず、代わりに有効なクエリを実行します。実際の Firestore インスタンスに対してアプリをテストし、必要なインデックスを決定してください。

制限事項

このエミュレータでは、本番環境で適用される制限すべてが適用されるわけではありません。たとえば、本番環境サービスではサイズが大きいことを理由に拒否されるトランザクションでも、エミュレータでは許容される場合があります。ドキュメントに記載されている制限を十分に理解し、事前にこうした制限を回避するようにアプリを設計してください。