
はじめに
こんにちは! GameWith サービス開発部のスケールアーキテクトチームです。
スケールアーキテクトチームでは、技術調査会という取り組みを定期的に行っており、GameWithで活用されている技術を中心に最新情報を調査し、優先度が高いものは各組織や会議体への周知をしたり、実際に改善を行ったりしています。
今回は、技術調査会でキャッチアップした中から、Firestore の Enterprise エディションで新しく使えるようになった Pipelineオペレーションについて紹介します。
Get data with Firestore Pipeline operations | Firebase
Pipelineオペレーションとは
新しい Firestore Enterprise エディションには、大きく2種類のクエリ手段があります。
- Coreオペレーション(従来のFirestoreのクエリ)
- Pipelineオペレーション
Pipelineオペレーションでは従来のオペレーションではできなかった、複雑な条件によるデータの取得が可能になったり、インデックスの作成も任意になることでパフォーマンス最適化が容易になるなど様々な改善がされているようです。
Pipelineオペレーションは現在プレビュー (pre-GA) として公開されており、サポートが制限される可能性があるため、その点に注意が必要です。
Firestore Enterpriseの環境を作ってみる
Firebase Console から作る場合は概ねこんな流れです。
- Firestore Database を開く
- Add database / Create database
- Enterprise editionを選択
- Firestore in Native modeを選択
- Database ID を入力(例:
defaultやenterpriseなど)

試してみた
test用コレクションのデータ定義
{ likeCount: number message: string createdAt: timestamp updatedAt: timestamp }
FirebaseのUIから複数のデータ投入ができなかったので、今回はJavaScriptのFirestoreのSDKからテストデータの投入を行いましたが、本質的なところではないので割愛します。
1. select対象のフィールドを選択できるようになった
SELECTで必要なフィールドだけ指定して取得できるようになりました。
db.pipeline().collection('test') .where(field("message").like("%栃木県%")) .select(field("likeCount"), field("message")) .limit(101)

2. 文字列検索(LIKE検索/正規表現)ができるようになった
Pipelineの文字列関数に LIKE があり、% や _ のワイルドカードでパターン検索できます。
db.pipeline().collection('test') .where(field("message").like("%栃木県%")) .limit(101)

より複雑な文字列絞り込みを行いたい場合でも、正規表現による検索で対応できます。
3. 集計関数が便利になった
例えば、絞り込んだ上でユニークなものを集計することができます。
db.pipeline().collection('test') .where(field("message").like("%栃木県%")) .aggregate(field("message").countDistinct().as("unique_message"))
likeでの絞り込みむと以下のようになります。

countDistinctを使った場合、「栃木県栃木市」が重複しているため3件になります。

まとめ
- Firestore の Enterprise エディションで新しく使えるようになった Pipelineオペレーションでは、次のようなクエリが書けるようになりました
- LIKE(部分一致)/ 正規表現
- select(投影)
- countDistinct などの集計
- 他にも多くの集計関数がありますので、詳しくはこちらのドキュメントを参照
- インデックスの追加が必須ではなくなり、インデックスが存在しないエラーが起きなくなりますが、パフォーマンスチューニングにおいて注意が必要です。
- プレビュー版ですので、随時機能の変更などが行われる可能性があります。
参考(公式)
- Firestore Pipelines オペレーション概要(Firebase)
- Get started with Pipeline operations(Firebase)
- String functions(LIKE / regex_contains など)
- Aggregate functions(countDistinct など)
- Pipeline operations の Security Rules(Google Cloud Documentation)
おわりに
GameWithではFirestoreを使った小規模プロジェクトを立ち上げることが多いため、複雑なクエリを書くことができなかったりする部分で苦労したことがありました。 今回それを解決できるリリースが行われたことをとても嬉しく思っています!
また、GameWithではエンジニアを絶賛募集中です。ご興味ありましたら是非カジュアル面談をお申し込みください!