日々ろぐ

人に優しく٩( 'ω' )و

FirestoreのRulesはフィルタじゃないんでそこのところよろしく

タイトルの通り。

思うところあって書いておこうと思う所存です。
主に読み取り(Read)について。

何が言いたいか

Rules はデータをフィルタリングするものではない。

例えば

自分が作ったメモだけ読み込める Rules

service cloud.firestore {
  match /databases/{database}/documents {
    match /Memo/{MemoId} {
      allow read: if request.auth.uid == resource.data.create_user;
    }
  }
}

メモデータは↓のように複数のユーザーが作っている

id memo create_user
1 玉ねぎを買って帰る。 user1
2 CreepyNutsのアルバム返す。 user2
3 テスト user5
4 歯医者の予約 user1
5 机の右の引き出しのしたから2番目 user2

この時、↓のようにデータを取得しようとするとクエリに失敗する

  async getMemo () {
    try {
      const querySnapShot = await firestore.collection('Category').get()
      // ~ 中略 ~
    } catch (error) {
      console.error(error)
    }
  }
FirebaseError: Missing or insufficient permissions.

理由は、ルールに合致しないデータも含めて取得しようとしているから。

このとき大事なのは、「ルールに合致するデータだけ取得できる」ではなく、「ルールに合致しないデータを取得しようとするクエリは失敗する」ということです。
SQL脳で考えていると、最初はこの考え方を勘違いしてしまいそうだけど、SQLとRulesは違うのだよってことですね。

ここら辺の考え方については、公式にも載ってます。

firebase.google.com

つまり

Rules はデータをフィルタリングするものではないのだよ。

とりあえず今日はここまで。