Collection Groupを使うと、異なるドキュメント配下の同名のサブコレクションをまとめてクエリできます。
たとえば、
preference collection:県
/document(京都、大阪、名古屋、岡山)
/specialty collection:名物
/document([name:八ツ橋, type:sweet] [name: たこ焼き, type: meal] [name:ひつまぶし, type: meal] [name:きびだんご, type: sweet])
という階層があったときに、
specialty collectionは別々のpreferenceドキュメントに属していますが、specialtyのくくりでまとめてクエリできます。
#手順
###1,セキュリティルールを追加
グループコレクションでクエリを行うには、途中までのパスがワイルドカードになったruleをFirestoreに追加します。
match /{path=**}/specialty/{document} {
allow read: if true;
}
###2,グループコレクションでクエリしてみる
Swiftの例は以下。他の言語は公式ドキュメント参照。
let db = Firestore.firestore()
db.collectionGroup("specialty").whereField("type", isEqualTo: "sweet").getDocuments { (snapshot, error) in
// ...
}
このクエリは失敗します。
なぜなら、Collection Group queryをサポートする Index をFirestore に追加する必要があるからです。
###3,Index を追加
上記クエリを実行すると、コンソールログにクエリに必要なインデックスを追加するためのリンクが表示されます。
ブラウザからそのリンクを開くと、必要なインデックスが自動で追加されます。
Firestoreコンソールから手動で追加することもできます。
3までの手順を実行して、改めて2,のクエリを実行すると、specialtyコレクションのスイーツタイプをもつドキュメントのスナップショットが得られます。
🐣
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com
Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。