>_tech-draft
Firebaseのアイコン
Firebase
動画公開日
タイトル

Getting started with Firestore Pipelines

再生時間

6分 29秒

Firestoreパイプライン操作入門: 複雑なクエリをサーバーサイドで効率処理

ポイント

  • Firestore Enterprise Editionのパイプライン操作は、大規模なデータや複雑なクエリ処理に悩む開発者向けの機能です。
  • この機能は、集計や高度なフィルタリングといった重いデータ処理をサーバーサイドで効率的に実行し、クライアント側の負担を大幅に軽減します。
  • アプリのパフォーマンス向上とユーザー体験の改善を実現し、データベース内でロジックを完結させるための具体的な手順とテスト方法が学べます。

Firestore Enterprise Editionのパイプライン操作で複雑なクエリを高速処理! Friendly Museアプリで学ぶサーバーサイドデータ処理入門

大規模なFirestoreドキュメントを集約する複雑なクエリを、アプリのパフォーマンスや月々の予算を犠牲にすることなく構築しようと試みたことはありますか? Firebaseチームのマリーナです。本日は、Firestoreのパイプライン操作を活用し、サーバーサイドで複雑なデータ処理を行う方法についてご紹介します。

なぜパイプライン操作が必要なのか?

Friendly Museというアプリを例に考えてみましょう。このアプリは、食材リストとメモに基づいてAIがレシピを生成します。フィルター画面ですべてのフィルターを適用しても、レシピリストは瞬時に更新されます。これはすべてサーバーサイドで処理されており、数千ものドキュメントをダウンロードしてクライアント側や共有のCloud Functionsで手動でフィルターしているわけではありません。これこそが、パイプライン操作の強力な利点です。

従来のFirestoreのクエリでは、特定の条件に基づいてドキュメントをフィルタリングすることは可能でしたが、データの集計や高度な変換、複雑な文字列マッチングなどを行うには、クライアント側で追加の処理が必要でした。これは、特に大量のデータを扱う場合に、アプリのパフォーマンス低下やネットワークコストの増加につながる大きな課題となります。

パイプライン操作は、これらの課題を解決するために設計されました。クライアントが大量のデータをダウンロードして処理するのではなく、データベース自身が重い処理を肩代わりしてくれるため、クライアント側の負担を大幅に軽減し、ユーザーエクスペリエンスを向上させることができます。

パイプライン操作とは何か?

簡潔に言えば、パイプライン操作はFirestore Enterprise Edition専用のクエリカテゴリです。これは、単一のクエリ内で複数のステージを連鎖させることを可能にします。例えば、次のような処理を実現できます。

  • 任意の集計 (Arbitrary aggregations)
  • マップ操作 (Map operations)
  • 正規表現を用いた文字列マッチング (String matching using regular expressions)
  • その他多数

アプリ開発者にとって、Firestoreのパイプラインを使用する意味は、データベースロジックをデータベース内で実行できる点にあります。データベースでフィルターし、さらにクライアントで再度フィルターしたり集計したりする必要がなくなります。パイプラインを使用することで、アプリが重い処理を行う代わりに、フィルタリング、グルーピング、計算などのステージのシーケンスを定義し、Firestoreが最終結果のみを返します。これにより、アプリは驚くほど高速に感じられるでしょう。

Firestoreデータベースの作成

それでは、実際にFirestoreデータベースを作成するところから始めましょう。

  1. Firebaseプロジェクトの作成: まず、Firebaseプロジェクトを作成し、クライアントサイドアプリを登録します。初めてFirebaseを使用する場合は、Firebaseの利用開始に関する動画が説明欄にリンクされていますので、数分でプロジェクトを立ち上げることができます。
  2. Firestoreセクションへ移動: プロジェクトの作成が完了したら、ナビゲーションメニューを使用してFirebaseコンソールのFirestoreセクションを開きます。
  3. データベースの作成: 「データベースを作成」をクリックし、データベースモードとして「Enterprise」を選択します。次に「次へ」をクリックします。
  4. 操作モードの選択: 操作モードとして「Firestoreネイティブモード」を選択します。データベースIDはデフォルトを使用するか、独自のカスタムIDを選択できます。次にデータベースのロケーションを選択し、「次へ」をクリックします。
  5. プロダクションモードで開始: 最後に、「プロダクションモードで開始」を選択し、「作成」をクリックします。

セキュリティに関する注意点

アプリを本番環境にデプロイする前に、強力なセキュリティルールを設定する必要があります。これらのルールは、認証され、認可されたユーザーのみがFirestoreに保存されているデータにアクセスできることを保証します。セキュリティルールに関するドキュメントへのリンクは、後ほど参考資料に含めます。

コーディング:複雑なクエリの構築

データベースが作成されたので、いよいよコーディングです。Friendly Museアプリを例に、いくつかの複雑なクエリを考案しましょう。

なお、プラットフォームに関する注意点です。本記事ではKotlinで記述されたAndroidアプリのコードの一部をご紹介しますが、サポートされているすべてのプラットフォームでロジックは同じです。言語を切り替えるには、わずかな構文の調整で済み、特定のスタックのスニペットはFirestoreドキュメントで入手できます。

データベースへの参照の取得

まず、コンソールで作成したデータベースへの参照を取得します。これは、以降すべてのFirestore呼び出しで使用されます。

データの書き込み、更新、削除

データの書き込み、更新、削除に関しては、Firestore Standard Editionで既にお使いの標準操作と同じものを使用できます。例えば、Friendly Museアプリにレシピを保存するには、recipesコレクションへの参照を取得し、レシピをパラメータとして渡してadd関数を呼び出すだけです。特定の書き込み操作(コレクション内のドキュメント全体でフィールドを埋め戻すなど)には、Firestoreパイプラインクエリに組み込まれたデータ操作を使用できます。

データの読み取り:パイプラインの構築

データを読み取るには、パイプラインを構築する必要があります。まず、pipeline関数を呼び出してソースコレクションを定義することから始めます。ドキュメントのリストをフィルターする必要がない場合は、ここでexecuteを呼び出し、結果オブジェクト内のドキュメントにアクセスできます。

このリストをフィルターしたい場合は、このパイプラインにさらにステージを追加する必要があります。例を見てみましょう。

  • 最小評価によるフィルター: ユーザーが選択した最小評価に基づいてレシピをフィルターしたい場合、greater than or equal操作を使用する必要があります。
  • タイトルによるフィルター: レシピをタイトルでフィルターしたい場合は、string contains操作とto lower関数のようなテキスト変換を実行できます。
  • タグによるフィルター: array contains any操作を使用して、ユーザーが様々なタグに基づいてフィルターできるようにすることも可能です。
  • 並べ替え: ユーザーが様々な方法でレシピを並べ替えられるようにしたい場合も問題ありません。sortを呼び出し、ソートに使用するフィールド名をパラメータとして渡し、昇順または降順のどちらでソートするかを定義するだけです。

そして最後に、パイプラインを実行し、結果を取得します。結果オブジェクトは、実行したパイプライン操作から構築されたドキュメントのリストです。これは、10,000件のレシピをフィルターした場合でも、アプリが受信するのはフィルターに一致するドキュメントを含む小さなJSONオブジェクトのみであることを意味します。その後、このJSONファイルをコードベースが認識するオブジェクトに変換するためのヘルパー関数を作成できます。

おめでとうございます!これで、重いデータロジックをクライアントからサーバーに移行しました。これはまだ始まりにすぎません。この高度なクエリエンジンには、100を超える新しいクエリ機能が搭載されており、Firestoreでのクエリに関してできることはさらにたくさんあります。

例えば、Firestore Enterprise Editionでは、全文検索やサブクエリを用いたジョインを実行できます。より複雑なクエリの構築方法については、追加の参考動画をご覧ください。

クエリのテストと説明

アプリにクエリを追加する前にテストしたい場合は、Firebaseコンソールで直接テストできます。Firestoreセクションにはクエリエクスプローラーがあり、JavaScriptでクエリを実行してテストできます。また、コンソールにはクエリ説明機能もあり、パイプラインがインデックスを使用しているか、それともローカルアクションスキャンを実行しているかを確認できます。

まとめ

本日はここまでです。Firestoreパイプライン操作がいかに複雑なデータ処理を効率的かつ高速にサーバーサイドで実行できるか、ご理解いただけたでしょうか。これにより、アプリのパフォーマンスを劇的に向上させ、開発体験を改善することができます。ドキュメントページやFriendly Museを自身のマシンで構築・実行するためのすべてのリソースを提供するコードラボへのリンクについては、説明欄をご確認ください。それでは、楽しいコーディングを!

参考動画