2017-10-05 16 views
0

firebase firestoreに一対多の関係を保存したいと思います。私に著者がいて、この著者に属する本があるとしましょう。私は、ネストされた関係でそれを格納することができ:firestoreで安全なRESTライクなAPIを作成する

author/ 
    authorId1 : { 
    books: [{...}, {...}] 
    } 

しかし、私はまた、好ましくは、(私の知る限り、それを必要としたリアルタイムDBを持つ)すべての作者を反復することなく、すべての書籍を一覧表示する方法が必要なので、私は私を想定しますする必要があります

author/ 
    authorId1 : { 
    books: [bookId1, bookId2] 
    } 
books/ 
    bookId1: {...} 
    bookId2: {...} 

セキュリティとパフォーマンスの理由から、私はむしろフロントエンドをフィルタリングしません。私はクエリを記述することが可能であることがわかった。

const bookRef = fireStore.collection('books'); 
debtorsRef.where('author', '==', authorId).then(...); 

は、これがうまくいけば、パフォーマンス上の問題を排除し、クライアントから他の著者の本をフェッチすることが可能になるだろうので、それは安全ではありません。私はむしろ著者の文書にその関係を格納したいと思います。

たとえば、Django Rest Frameworkのような安らかなAPIでは、特定のユーザーに属する書籍のみを返すようにクエリセットを制限します。 IIUCそれはIAMで可能ですが、例に基づいて私はどのようにはっきりしていません。

また、著者の書籍プロパティにそのIDが記載されている場合にのみ、書籍を返送したいと思います。 1つの本は理論的には複数の著者に属することができます。

これは重複していると思いますが、多くの人がこの懸念を抱いていましたが、この具体的な使用例には明確な答えが見つかりませんでした。

答えて

1

あなたが適切にあなたのクエリを確保するためにSecurity Rulesを書き込むことができます。現時点で我々は唯一の等式の制約(==)とない不平等(!=<<=など)

をサポートしていること

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /books/{bookId} { 
     allow read: if request.resource.data.author == resource.data.author 
    } 
    } 
} 

注意を

この概念を拡張して、各書籍のサブコレクション内の所有者のリストを維持し、存在チェックを行います(exists()関数を使用)。

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /books/{bookId} { 
     allow read: if exists(/databases/$(database)/documents/books/$(bookId)/owners/$(request.auth.uid)) 
     match /owners/{ownerId} { 
     // Include other conditions that provide for ownership checks 
     allow write: if request.auth.uid == ownerId; 
     } 
    } 
    } 
} 
+0

それを正しく理解すれば、現在著者にbookIdがあることを確認する方法はありません。各本が複数のユーザーに属していても、多対1の関係をどのように表現しますか? – fodma1

+0

この情報を含めるように答えを更新しました –

関連する問題