2016-12-14 5 views
1

childByAutoIdは、同じタイプの複数の子ノードにノードを保存する場合に役立ちます。つまり、各子はそれぞれ固有の識別子を持ちます。特定の子の値にアクセスするためのFirebaseルール

List:{ 
KJHBJJHB:{ 
    name:List-1, 
    owner:John Doe, 
    user_id:<Fire base generated User_id> 
}, 
KhBHJBJjJ:{ 
    name:List-2, 
    owner:Jane Lannister, 
    user_id:<Fire base generated User_id> 
}, 
KhBHJZJjZ:{ 
    name:List-3, 
    owner:John Doe, 
    user_id:<Fire base generated User_id> 
} 
} 

私は、次のコードの助けを借りてListにアクセスしようとしています:

let ref = FIRDatabase.database().reference(withPath: "/List") 

アプリにログインして、現在のユーザーがJohn Doeです。ユーザーがリストにアクセスすると、所有者がJohn Doe(つまりList-1 & List-3)のすべての子Listが残り、他の子値は無視されます。

私のアプリケーションでこれを行う必要がありますか、これはFirebaseのセキュリティルールで実現できますか?

私の現在のルール定義は次のとおりです。

"List":{ 
".read": "root.child('List/'+root.child('List').val()+'/user_id').val() === auth.uid" } 

しかし、このルールは私に任意の成功を与えていません。どのように希望の結果を達成するための任意のアイデア?

+0

クエリを使用してみましたか? – gasho

+0

@gashoはい、クエリを使って、ブランチ全体をプルダウンして、必要なものだけを残すことができます。 しかし、実際に私は自分のアプリケーション側でクエリを実行する必要はありませんので、firebase自体から必要なデータを取得しようとしています。 –

答えて

1

セキュリティルールを使用してリストをフィルタリングしようとしています。これは不可能であり、開発者がSQLのバックグラウンドからFirebaseに来るのに共通の落とし穴の1つです。 「ルールはフィルターではない」として、我々は、一般的にそれを参照してください、あなたはでそれについての詳細を学ぶことができます。

ほとんどの場合、解決策は同じです。各ユーザーがアクセスできる投稿のキーのリストを個別に保管してください。

UserLists:{ 
    JohnUid: { 
    KJHBJJHB: true, 
    KhBHJZJjZ: true 
    }, 
    JaneUid: { 
    KhBHJBJjJ: true 
    } 
} 

このタイプのリストは、実際の投稿への参照を含んでいるため、インデックスと呼ばれることがあります。この構造の詳細については、Firebase documentation on structuring dataをご覧ください。

関連する問題