LoginSignup
45
47

More than 5 years have passed since last update.

Cloud Firestoreでクエリを使ってみたら便利だった話

Last updated at Posted at 2018-02-16

Cloud Firestoreを最近がっつり使っていて
本当に素晴らしいサービスだと思います。(使っていくうちに辛いところも見えてきましたが、、、、)

その中でクエリが素晴らしかったので共有します。

Realtime DatabaseのときのDB設計

usergroup があって userがどのグループに所属しているかを保存する users_group があるとき
の図が下記のようになると思います。

スクリーンショット 2018-02-16 18.01.11.png

実装した中に
「グループに所属するユーザー一覧を取得したい」という要件がでてきたら自分はこう作り変えます。

スクリーンショット 2018-02-16 18.06.16.png

この場合グループに所属するユーザー一覧を保存する groups_user を作成することになると思います。
これだとすごくめんどくさいですよね。

なんでかっていうと

例えばユーザーがグループを作成し、作成したユーザーがそのグループに入るとき、
groups_userusers_group 両方を一気に更新する必要があります。

解決

Cloud Firestoreのクエリを使えば解決できました!

データを下記のように追加します。

スクリーンショット 2018-02-16 18.10.58.png

あとは、クエリを実行するば

グループに所属するユーザー一覧する場合

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

45
47
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
47