2017-07-20 8 views
0

私はFirebaseで、次の「データベース」を持っている:Firebase - ユーザIDがオブジェクトのキーと一致する場合にのみデータを取得する方法は?

projects: { 
    "-KpVHI1za0ElBWIJWb2k": { 
    "name": "John's project" 
    "uId": "Kojh6pkRNJPBzU78yzNXUiFv3aP2" 
    }, 
    "-KpVHI1zadedldedWIJWb2k": { 
    "name": "Kojh6pkRNJPBzU78yzNXUiFv3aP2" 
    "uId": "Kojh6pkRNJPBzU78yzNXUiFv3aP2 
    }, 
    "-KpVKKjSnCD3obVW-hsw": { 
    "name": "Kojh6pkRNJPBzU78yzNXUiFv3aP2" 
    "uId": "KPQgqAniekUhavofb79v2Jqjdwh1" 
    } 
} 

は、特定の「UID」の値を持つすべてのプロジェクトを取得するためにfirebaseルールを使用して、方法はあります。 例えば、私は場所にこれらのルールを持っていますが、彼らは動作しません:

{ 
    "rules": { 
    "projects": { 
     ".read": "auth != null && data.child('uId').val() == auth.uid", 
     ".write": "auth != null" 
    } 
    } 
} 

私は次のクエリ

firebase.database().ref('projects')on('value', (project) => { 
     onRequestProject(project) 
     }, (error) => { 
     onRequestError(error) 
     }) 

をやっている私はFirebaseマニュアルに見えたが、私は解決するために何かをそこに見つけることができませんでしたこの。 エラー:「エラー:PERMISSION_DENIED」。 助けを歓迎します!

ありがとうございました!

答えて

1

問題はすべての子オブジェクトを読み込もうとしていますが、一致するuidを持つ子オブジェクトを読み込むルールが指定されています。

にDBクエリを変更してみてください:上記の方法が機能しない場合、私はあなたがこのような何かにデータベース構造を変更することをお勧め

firebase.database().ref('projects').orderByChild('uId').equalTo(<your_reqd_userId>).on('value', (project) => { 
    onRequestProject(project) 
    }, (error) => { 
    onRequestError(error) 
    }) 

"projects": { 
    "uid1":{ 
     Add your child objects here. 
    }, 
    "uid2":{ 
     Add your child objects here. 
    } 
} 

とセキュリティルールTo:

{ 
    "rules": { 
    "projects": { 
     "$uId": { 
      ".read": "auth.uid === $uId", 
      ".write": "auth.uid === $uId" 
     } 
    } 
} 

そして、あなたのDBクエリは次のようになります。

firebase.database().ref('projects').child(<your_reqd_userId>).on('value', (project) => { 
    onRequestProject(project) 
    }, (error) => { 
    onRequestError(error) 
    }) 
+0

ありがとうございました!それが私の質問を解決しました。非常によく説明されています。 –

関連する問題