サーバー クライアント ライブラリを使用して Cloud Firestore Enterprise エディションを使ってみる

このクイックスタートでは、Cloud Firestore を設定してデータを追加し、Core オペレーションまたは Pipeline オペレーションを使用して、Java、Node.js、Python のサーバー クライアント ライブラリを使用して Firebase コンソールで追加したデータをクエリする方法について説明します。

これらのクライアント ライブラリを使用して、データベースへの完全アクセス権を備えた特権的サーバー環境を設定します。

Cloud Firestore データベースを作成する

  1. まだ Firebase プロジェクトを作成していない場合は作成します。Firebase コンソールで[プロジェクトを追加] をクリックし、画面上の指示に沿って、Firebase プロジェクトを作成するか、Google Cloud プロジェクトに Firebase サービスを追加します。

  2. Firebase コンソールでプロジェクトを開きます。左側のパネルで [ビルド] を展開し、[Firestore データベース] を選択します。

  3. [データベースを作成] をクリックします。

  4. データベース モードとして [Enterprise] を選択します。

  5. オペレーション モードとして [ネイティブ モードの Firestore] を選択します。このモードでは、Core オペレーションと Pipeline オペレーションがサポートされます。

  6. データベースのロケーションを選択します。

  7. Cloud Firestore Security Rules の開始モードを選択します。

    テストモード

    モバイルおよびウェブ クライアント ライブラリを使用する場合に適していますが、すべてのユーザーがデータを読み書きできます。テストが終わったら、必ずデータのセキュリティ保護セクションを確認してください。

    ウェブ、Apple プラットフォーム、Android SDK を使用する場合は、テストモードを選択します。

    本番環境モード

    モバイルおよびウェブ クライアントからのすべての読み書きを拒否します。認証されたアプリケーション サーバー(Node.js、Python、Java)は引き続きデータベースにアクセスできます。

    デフォルトの Cloud Firestore データベースには、Cloud Firestore Security Rules の初期セットが適用されます。プロジェクトに複数のデータベースを作成する場合は、データベースごとに Cloud Firestore Security Rules をデプロイできます。

  8. [作成] をクリックします。

Cloud Firestore を有効にすると、Cloud API Manager で API も有効になります。

開発環境を設定する

必要な依存関係とクライアント ライブラリをアプリに追加します。

Node.js
  1. アプリに Firebase Admin SDK を追加します。
    npm install firebase-admin --save
  2. 以下の手順に従い、ご使用の環境で適切な認証情報を使用して Cloud Firestore を初期化します。
Python
  1. Firebase Admin SDK を Python アプリに追加します。
    pip install --upgrade firebase-admin
  2. 以下の手順に従い、ご使用の環境で適切な認証情報を使用して Cloud Firestore を初期化します。
Java
  1. アプリに Firebase Admin SDK を追加します。
    • Gradle を使用する:
      implementation 'com.google.firebase:firebase-admin:9.7.0'
    • Maven を使用する:
      <dependency>
        <groupId>com.google.firebase</groupId>
        <artifactId>firebase-admin</artifactId>
        <version>9.7.0</version>
      </dependency>
           
  2. 以下の手順に従い、ご使用の環境で適切な認証情報を使用して Cloud Firestore を初期化します。

Cloud Firestore を初期化する

Cloud Firestore のインスタンスを初期化します。

Node.js
Cloud Firestore SDK を初期化する方法は環境に応じて異なります。最も一般的な方法を以下に示します。完全なリファレンスについては、Admin SDK の初期化をご覧ください。
  • Cloud Functions で初期化する
    const { initializeApp, applicationDefault, cert } = require('firebase-admin/app');
    const { getFirestore, Timestamp, FieldValue, Filter } = require('firebase-admin/firestore');
    initializeApp();
    
    const db = getFirestore();
    
  • Google Cloud で初期化する
    const { initializeApp, applicationDefault, cert } = require('firebase-admin/app');
    const { getFirestore, Timestamp, FieldValue, Filter } = require('firebase-admin/firestore');
    initializeApp({
      credential: applicationDefault()
    });
    
    const db = getFirestore();
  • 各自のサーバーで初期化する

    各自のサーバー(またはその他の Node.js 環境)で Firebase Admin SDK を使用するには、サービス アカウントを使用します。Google Cloud コンソールで [IAM と管理] > [サービス アカウント] にアクセスします。新しい秘密鍵を生成し、JSON ファイルを保存します。次に、このファイルを使用して SDK を初期化します。

    const { initializeApp, applicationDefault, cert } = require('firebase-admin/app');
    const { getFirestore, Timestamp, FieldValue, Filter } = require('firebase-admin/firestore');
    const serviceAccount = require('./path/to/serviceAccountKey.json');
    
    initializeApp({
      credential: cert(serviceAccount)
    });
    
    const db = getFirestore();
    
Python
Cloud Firestore SDK を初期化する方法は環境に応じて異なります。最も一般的な方法を以下に示します。完全なリファレンスについては、Admin SDK の初期化をご覧ください。
  • Google Cloud で初期化する
    import firebase_admin
    from firebase_admin import firestore
    
    # Application Default credentials are automatically created.
    app = firebase_admin.initialize_app()
    db = firestore.client()

    既存のアプリケーションのデフォルト認証情報も SDK を初期化する際に使用できます。

    import firebase_admin
    from firebase_admin import credentials
    from firebase_admin import firestore
    
    # Use the application default credentials.
    cred = credentials.ApplicationDefault()
    
    firebase_admin.initialize_app(cred)
    db = firestore.client()
  • 各自のサーバーで初期化する

    各自のサーバーで Firebase Admin SDK を使用するには、サービス アカウントを使用します。

    Google Cloud コンソールで [IAM と管理] > [サービス アカウント] にアクセスします。新しい秘密鍵を生成し、JSON ファイルを保存します。次に、このファイルを使用して SDK を初期化します。

    import firebase_admin
    from firebase_admin import credentials
    from firebase_admin import firestore
    
    # Use a service account.
    cred = credentials.Certificate('path/to/serviceAccount.json')
    
    app = firebase_admin.initialize_app(cred)
    
    db = firestore.client()
  • Java
    Cloud Firestore SDK を初期化する方法は環境に応じて異なります。最も一般的な方法を以下に示します。完全なリファレンスについては、Admin SDK の初期化をご覧ください。
  • Google Cloud で初期化する
    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.cloud.firestore.Firestore;
    
    import com.google.firebase.FirebaseApp;
    import com.google.firebase.FirebaseOptions;
    
    // Use the application default credentials
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
    FirebaseOptions options = new FirebaseOptions.Builder()
        .setCredentials(credentials)
        .setProjectId(projectId)
        .build();
    FirebaseApp.initializeApp(options);
    
    Firestore db = FirestoreClient.getFirestore();
  • 各自のサーバーで初期化する

    各自のサーバーで Firebase Admin SDK を使用するには、サービス アカウントを使用します。

    Google Cloud コンソールで [IAM と管理] > [サービス アカウント] にアクセスします。新しい秘密鍵を生成し、JSON ファイルを保存します。次に、このファイルを使用して SDK を初期化します。

    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.cloud.firestore.Firestore;
    
    import com.google.firebase.FirebaseApp;
    import com.google.firebase.FirebaseOptions;
    
    // Use a service account
    InputStream serviceAccount = new FileInputStream("path/to/serviceAccount.json");
    GoogleCredentials credentials = GoogleCredentials.fromStream(serviceAccount);
    FirebaseOptions options = new FirebaseOptions.Builder()
        .setCredentials(credentials)
        .build();
    FirebaseApp.initializeApp(options);
    
    Firestore db = FirestoreClient.getFirestore();
  • Core オペレーションを使用してデータを追加する

    データのクエリに使用する Core オペレーションと Pipeline オペレーションを試すには、Core オペレーションを使用してデータベースにデータを追加します。

    Cloud Firestore はデータをドキュメント内に保存します。ドキュメントはコレクション内に保存されます。データを初めてドキュメントに追加すると、Cloud Firestore によってコレクションとドキュメントが暗黙的に作成されます。コレクションやドキュメントを明示的に作成する必要はありません。

    次のサンプルコードを使用して、新しいコレクションとドキュメントを作成します。

    Node.js
    const docRef = db.collection('users').doc('alovelace');
    
    await docRef.set({
      first: 'Ada',
      last: 'Lovelace',
      born: 1815
    });
    Java
    DocumentReference docRef = db.collection("users").document("alovelace");
    // Add document data  with id "alovelace" using a hashmap
    Map<String, Object> data = new HashMap<>();
    data.put("first", "Ada");
    data.put("last", "Lovelace");
    data.put("born", 1815);
    //asynchronously write data
    ApiFuture<WriteResult> result = docRef.set(data);
    // ...
    // result.get() blocks on response
    System.out.println("Update time : " + result.get().getUpdateTime());
    Python
    doc_ref = db.collection("users").document("alovelace")
    doc_ref.set({"first": "Ada", "last": "Lovelace", "born": 1815})

    Core オペレーションを使用してデータを読み取る

    Firebase コンソールのデータビューアを使用して、Cloud Firestore にデータが追加されたことをすばやく確認します。

    また、"get" メソッドを使用してコレクション全体を取得することもできます。

    Node.js
    const snapshot = await db.collection('users').get();
    snapshot.forEach((doc) => {
      console.log(doc.id, '=>', doc.data());
    });
    Python
    users_ref = db.collection("users")
    docs = users_ref.stream()
    
    for doc in docs:
        print(f"{doc.id} => {doc.to_dict()}")
    Java
    // asynchronously retrieve all users
    ApiFuture<QuerySnapshot> query = db.collection("users").get();
    // ...
    // query.get() blocks on response
    QuerySnapshot querySnapshot = query.get();
    List<QueryDocumentSnapshot> documents = querySnapshot.getDocuments();
    for (QueryDocumentSnapshot document : documents) {
      System.out.println("User: " + document.getId());
      System.out.println("First: " + document.getString("first"));
      if (document.contains("middle")) {
        System.out.println("Middle: " + document.getString("middle"));
      }
      System.out.println("Last: " + document.getString("last"));
      System.out.println("Born: " + document.getLong("born"));
    }

    Pipeline オペレーションを使用してデータを読み取る

    これで、Pipeline クエリ エクスペリエンスと Core クエリ エクスペリエンスを比較できます。

    Node.js
    const readDataPipeline = db.pipeline()
      .collection("users");
    
    // Execute the pipeline and handle the result
    try {
      const querySnapshot = await readDataPipeline.execute();
      querySnapshot.results.forEach((result) => {
        console.log(`${result.id} => ${result.data()}`);
      });
    } catch (error) {
        console.error("Error getting documents: ", error);
    }
    Python
    pipeline = client.pipeline().collection("users")
    for result in pipeline.execute():
        print(f"{result.id} => {result.data()}")
    Java
    Pipeline pipeline = firestore.pipeline().collection("users");
    ApiFuture<Pipeline.Snapshot> future = pipeline.execute();
    for (com.google.cloud.firestore.PipelineResult result : future.get().getResults()) {
      System.out.println(result.getId() + " => " + result.getData());
    }
    // or, asynchronously
    pipeline.execute(
        new ApiStreamObserver<com.google.cloud.firestore.PipelineResult>() {
          @Override
          public void onNext(com.google.cloud.firestore.PipelineResult result) {
            System.out.println(result.getId() + " => " + result.getData());
          }
    
          @Override
          public void onError(Throwable t) {
            System.err.println(t);
          }
    
          @Override
          public void onCompleted() {
            System.out.println("done");
          }
        });

    次のステップ

    次のトピックで Core オペレーションと Pipeline オペレーションの知識を深めてください。