我的应用中有一个消息列表,我希望我的用户能够检索自己的消息列表。
如果我已登录为" user1"我可以毫无问题地获取 / messages / message1 ,但如果我想通过 / messages /检索我的所有邮件(无法访问其他用户的邮件) 即使我可以访问某些子元素
,我也会被拒绝如何在不知道消息ID的情况下,为用户提供具有读取权限的所有子元素的列表?
提前谢谢。
以下是我的数据库:
{
"messages" : {
"message1" : {
"sender" : "user1_uid"
},
"message2" : {
"sender" : "user1_uid"
}
}
这是我的规则:
{
"messages": {
"$weddingId": {
".read": "data.child('sender').val() == auth.uid"
}
}
}
答案 0 :(得分:2)
我建议进行重构以实现您期望的内容,因为您无法使用.orderByChild('sender').equalTo(user_uid)
,因为您没有对/messages
分支提供读取权限(仅适用于其子代)。
您可以将userId
作为/messages
中的分支,并在其中包含所有播放器消息ID。您需要保存消息数据,如下所示:
{
"messages" : {
"userId" : {
"message1" : {
"text": "tetet"
},
"message2" : {
"text" : "tetet2"
}
},
"userId2": {...}
}
然后你的规则将如下:
{
"messages": {
"$userId":{
".read": "$userId == auth.uid",
"$weddingId": {
//...
}
}
}
最后,您将能够拥有以下所有用户消息:
firebaseRef.child('messages').child(user_uid).once('value', function(snapshot) {
if (snapshot.val()){
console.log(snapshot.val());
}
})
答案 1 :(得分:1)
阿道夫有一种有效的方法。他在特定于用户的节点下传播消息数据。这在NoSQL数据库中很常见,基本上构建了许多消息的迷你表格。而不是一个大的。
或者,您可以将消息的主列表保留在现在的位置,但为每个用户创建一个所谓的消息索引:
{
"messages" : {
"message1" : {
"sender" : "user1_uid"
},
"message2" : {
"sender" : "user1_uid"
}
},
"user_messages": {
"user1_uid": {
"message1": true,
"message2": true
}
}
您现在已经保留了messages
的安全规则,但是为新的user_messages
索引添加了这些规则:
"user_messages": {
"$userId":{
".read": "$userId == auth.uid"
}
}
有了这些功能,您可以先为/user_messages/<authData.uid>
加载邮件ID,然后从/messages/<messageId>
加载每封邮件,为用户加载邮件。
另请参阅我们的guide on creating data that scales了解有关此技术的更多信息(称为扇出)。