Cloud Firestoreを最近がっつり使っていて
本当に素晴らしいサービスだと思います。(使っていくうちに辛いところも見えてきましたが、、、、)
その中でクエリが素晴らしかったので共有します。
Realtime DatabaseのときのDB設計
user
と group
があって user
がどのグループに所属しているかを保存する users_group
があるとき
の図が下記のようになると思います。
実装した中に
「グループに所属するユーザー一覧を取得したい」という要件がでてきたら自分はこう作り変えます。
この場合グループに所属するユーザー一覧を保存する groups_user
を作成することになると思います。
これだとすごくめんどくさいですよね。
なんでかっていうと
例えばユーザーがグループを作成し、作成したユーザーがそのグループに入るとき、
groups_user
と users_group
両方を一気に更新する必要があります。
解決
Cloud Firestoreのクエリを使えば解決できました!
データを下記のように追加します。
あとは、クエリを実行するば
グループに所属するユーザー一覧する場合
val groupRef = db.collection("users_group")
groupRef.whereEqualTo("group_id", [検索したいgroup_id]).get()
.addOnSuccessListener {
val resultList = ArrayList<GroupEntity>()
it.forEach {
//ここで一覧を取得できる
}
renderGroupList(resultList)
<img width="290" alt="スクリーンショット 2018-02-16 18.01.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/139360/d7ca5dcb-512c-22ca-ca7c-769136d1919a.png">
}
ユーザーが所属しているグループ一覧一覧する場合
val groupRef = db.collection("users_group")
groupRef.whereEqualTo("uid", [検索したいuid]).get()
.addOnSuccessListener {
val resultList = ArrayList<GroupEntity>()
it.forEach {
//ここで一覧を取得できる
}
renderGroupList(resultList)
}
すばらしい。
これで無駄なテーブルにドキュメントにデータを保存する必要がなくなりました。
素晴らしい。
P.S
FirebaseのTシャツください。
くれる人下記まで連絡ください。
https://twitter.com/yshogo87