firebaseのチャットで画像を扱うために

LINEのようなチャットツールでは、チャットしている時系列に画像を表示したり、それとは別に、写真だけを一覧表示することができる。

これがRDBMSでは頭を捻らなくても実装することができるが、firebaseのようなNoSQLでこれを実装するためにはどのようにすれば良いか。

その場合は、 collectionGroup() を使用してすることで実装することができる。

そのために以下のようなコレクションを定義する。

※C: コレクション ※d: ドキュメント

rooms(C)
  - room1(d)
    - name
    - description
    - messages(C)
      - XXX(d)
        - body
          - images(C)
    - members(C)
      - member1(d)
        - name
        - photoUrl

写真を時系列のメッセージと共に流す際には、

db.collection("rooms").doc("room1").collection("messages")

のように普通通りに取得をして、画像だけを一覧したい場合は

db.collection("rooms").doc("room1")collectionGroup("images")

を実行する。

collectionGroupを使うことで、他のmessagesドキュメントの写真を串刺しにして取得することができる。