Cloud Firestore ドキュメント ID でコレクショングループクエリ

January 05, 2021

はじめに

「DB と言えば MySQL」で育ってきた身としては、Cloud Firestore におけるサブコレクションにビビってしまうわけですが、コレクショングループクエリもありますし、便利ではあるので、開発には積極的に導入しつつあります。

ただ、このコレクショングループクエリとドキュメント ID を組み合わせたケースでハマりました。

前提

やりたいこと

stores コレクションに shoppingLists サブコレクションを追加したデータ構造において、ドキュメント ID 指定で一意に shoppingLists ドキュメントを参照」を Firebase Admin SDK で実現。

困ったこと

下記のようなコードを用意したのですが、

const shoppingListId = 'shoppingListIdSAMPLE';
const firestore = new admin.firestore.Firestore();
const shoppingListQuerySnapshot = await firestore.collectionGroup('shoppingLists').where(admin.firestore.FieldPath.documentId(), '==', shoppingListId).get();

When querying a collection group and ordering by FieldPath.documentId(), the corresponding value must result in a valid document path, but 'shoppingListIdSAMPLE' is not because it contains an odd number of segments. とエラーが出てしまいました。

解決策

「ドキュメント ID 指定をフルパスにする」が正解でした。

const shoppingListId = '/stores/storeIdSAMPLE/shoppingLists/shoppingListIdSAMPLE';

前述のエラーメッセージ内容も含めて、よくよく考えると納得ですね。あれ、そうなるとドキュメント ID を使ったコレクショングループクエリの旨味はあるのかという話は一旦気にしません・・・。

ちなみに公式ドキュメントに記載のある コレクション グループ クエリを使用する前に、コレクション グループ クエリをサポートするインデックスを作成する必要があります。 ってお決まりの手順は(もちろん?)不要になります。

おわりに

Cloud Firestore は奥が深いですね。


Product

「いつやるかは決めてないけれど、必ずやらなければいけないタスク」を忘れないためのアプリ