🔥
FirestoreでDocumentのSnapShotからSubCollectionを取得する
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