本日はルームの一覧を取得して、Slackっぽくサイドバーに表示させたいと思います。
画面イメージ
方針
前日 で作成したroomドキュメントはmembersプロパティに参加者のarrayを保持しています。
このarrayにサインインしているユーザーが含まれているものを検索して表示します。
少しハマった(´・ω・`)
参考: Get data with Cloud Firestore | Firebase
Cloud Datastoreではarray型プロパティに対して =
オペレータでフィルタできます。で、同じ感覚で db.collection("rooms").where("members", "=", email)
としても一件もhitしない。
ググったら
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とほぼ同じことができそうで安心してます。
さらに in
や array-contains-any
が使えるのも嬉しいですね(今回のアプリで必要になるかは分かりませんが)。
明日はセキュリティルールにトライしてみる予定です。
牛歩進捗ですが頑張りますq(^_^)p