Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Firebase Firestoreのcollection groupを使ってみる

More than 1 year has passed since last update.

security rulesとindexesも含めたら思ったより時間がかかってしまったのでメモ

やりたいこと

メッセージの公開/非公開を設定できるメッセージ投稿アプリを考える
公開されたメッセージの一覧を表示したい

Firestoreの構造は以下のようにする

user/{uid}/posts/{docId}

{
  body: string,
  timestamp: timestamp,
  isPublic: boolean
}

posts以下の、isPublic: trueなdoc一覧を取得したい

やったこと

security rules

security rulesは以下のようにした

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    function published() {
      return resource.data.isPublic == true
    }

    match /user/{uid} {
      match /posts/{docId} {
        allow read, write: if request.auth.uid == uid;
      }
    }

    match /{path=**}/posts/{docId} {
      allow list: if published();
      allow get: if published();
    }
  }
}

Firebaseのdocumentを参考にした

一行目の rules_version = '2';と、
最後のmatch /{path=**}/posts/{docId} が必要っぽい

indexes

公開メッセージを時間順に並べたいので、インデックスを設定する

Firebaseのconsoleでインデックスを設定する

Database > インデックス > 複合
このモーダルのコンテンツがスクロールできることに気づかなくて数分使った :cry:
Screen Shot 2019-05-19 at 10.30.04.png

isPublic, timestampでインデックスを作成した
Screen Shot 2019-05-19 at 10.33.10.png

取得

以下のように取得した

const firestore = firebase.firestore()

const snapshot = await firestore
  .collectionGroup("posts")
  .where('isPublic', '==', true)
  .orderBy('timestamp', 'desc')
  .get()

snapshot.forEach(function(doc) {
  console.log(doc.id, doc.data())
}

無事取得できた

わかったこと

  • collection idが同じならどの階層にあってもそれ以下のdocsを取得する
  • 一つでもlist, get権限がないcollectionが含まれてるとエラーになる :thinking:
    • FirebaseError: Missing or insufficient permissions.
  • 日本語だとcollection groupのドキュメントのページが(現状)無い
    • 日本語が追加されてた
  • isPublicでフィルタしたいだけなら、単一フィールドで除外を追加すると良さそう
nanotumblr
登山、写真、キャンプ、旅行
https://applicotsource.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away