The Round

合同会社ナイツオの開発ブログ

[PR] 5分から相談できるGCP™ 開発コンサル!→こちら

Firebaseでチャットアプリを作る日記(6日目)〜 ルームの一覧を取得する

本日はルームの一覧を取得して、Slackっぽくサイドバーに表示させたいと思います。

画面イメージ

方針

前日 で作成したroomドキュメントはmembersプロパティに参加者のarrayを保持しています。

このarrayにサインインしているユーザーが含まれているものを検索して表示します。

少しハマった(´・ω・`)

参考: Get data with Cloud Firestore  |  Firebase

Cloud Datastoreではarray型プロパティに対して = オペレータでフィルタできます。で、同じ感覚で db.collection("rooms").where("members", "=", email) としても一件もhitしない。

ググったら

配列、リスト、セットの操作  |  Firebase

Cloud Firestore では配列を保存できますが、配列メンバーのクエリや単一配列要素の更新はサポートしていません

と出てきて愕然(;゚Д゚)

いやいや、array-contains-anyがサポートされたとか言ってたでしょ!!

ここでぐっと堪えて GCPのドキュメントは英語版を読め という格言を思い出し、ドキュメントページ右上の言語選択プルダウンから English を選択します。

https://firebase.google.com/docs/firestore/query-data/queries#array_membership

あった!\(^o^)/

= じゃなくて array-contains を使うのですね。

コード

export function roomList(email) {
  let db = firebase.firestore();

  db.collection("rooms").where("members", "array-contains", email)
    .get()
    .then(function(querySnapshot) {
        _rooms = [];
        querySnapshot.forEach(function(roomRef) {
          let room = roomRef.data();

          _rooms = [..._rooms, room];
        });

        // サイドバーにroomリスト追加(Svelte)
        rooms.set(_rooms);
    })
    .catch(function(error) {
        console.log("Error getting documents: ", error);
    });
  return _rooms;
}

まとめ

クエリの機能は勝手知ったるDatastoreとほぼ同じことができそうで安心してます。 さらに inarray-contains-any が使えるのも嬉しいですね(今回のアプリで必要になるかは分かりませんが)。

明日はセキュリティルールにトライしてみる予定です。

牛歩進捗ですが頑張りますq(^_^)p