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 は奥が深いですね。