🔥

FirestoreでDocumentのSnapShotからSubCollectionを取得する

2021/09/05に公開

FirestoreではDocumentのSnapShotから、そのDocumentに紐づくSubCollectionを取得出来ないようになっています。
クエリで特定のDocumentのSnapShotを取得した後にSubCollectionを取得するには一手間必要なので、その方法を紹介します。

例に使うデータ構造

ルートにUsersコレクションを持ち、各ユーザードキュメントがSubCollectionでPetsを持つデータ構造を考えます。

Collection Document Data(key) Data(value) SubCollection Document Data(key) Data(value)
Users
id1 name alice Pets
id11 kind dog
id12 kind cat
id2 name bob Pets
id21 kind bird

DocumentのSnapShotからSubCollectionを取得する

今回はTypescriptでの例を示します。
上のデータ構造において、aliceが持つペットの内、dogを取得してみます。

const snapShot = await db.collection("users")
        .where(
            "name", "==", "alice"
        )
        .get();
const document = snapShot.docs[0];
const dogSnapShot = await document.ref.collection("Pets")
        .where(
            "kind", "==", "dog"
        )
        .get();

ポイント

SnapShotの取得は非同期なので、各言語の非同期処理を使って取得して下さい。
(今回の例では await を使った)
取得したSnapShotからSubCollectionを取得する時は、 document.ref のように参照する必要があります。

まとめ

FirestoreにおいてSubCollectionは便利な機能であるが、ややクエリが書きづらです。
必要に応じて、ルートのCollectionにするなど、データ構造を見直すことも必要でしょう。

Discussion