我有数据库json结构:
{
"notifications" : {
"approved" : {
"notification_1" : {..},
"notification_2" : {..},
"notification_4" : {..},
"notification_6" : {..}
},
"pending" : {
"notification_3" : {..},
"notification_5" : {..},
"notification_7" : {..},
"notification_8" : {..}
}
},
"users" : {
"some_user" : {
"sent_notifications" : {
"notification_1" : "notification_1",
"notification_2" : "notification_2",
"notification_4" : "notification_4",
"notification_6" : "notification_6"
}
}
}
安全规则如下:
{
"rules": {
"notifications": {
"approved": {
".read" : true,
".write" : "auth.uid === 'admin'"
},
"pending": {
".write" : "auth != null && (newData.child('by_user').val() === auth.uid || auth.uid === 'admin')",
"$id" : {
".read" : "data.child('by_user').val() == auth.uid || auth.uid == 'admin'"
}
}
},
"users" : {
"$user_id":{
".read" : "auth.uid === $user_id",
".write": "auth.uid === $user_id"
}
}
}
}
此处,'sent_notifications'存储由用户添加的通知ID。 在客户端(Android),我希望获取notifications/approved
和notifications/pending
的对象列表,其中的密钥位于“sent_notifications”中。当用户发送通知时,通知数据进入“待定”状态,该通知的密钥存储在“sent_notification”中。审核后,管理员会将数据从待处理节点移至已批准节点。使用任何方法,我发现自己在服务器上进行了大量查询,逐个获取所有节点。我需要一个更好的方法来做到这一点。
我是firebase数据库的新手。这可能不是实现数据库结构的最佳方式。我需要notifications/approved
对普通公众可见,notifications/pending/$id
仅对发送通知的用户可见。 This是上述结构的参考。如果有更好的方法来实现它,请帮助我。
答案 0 :(得分:1)
一个选项如下:
拥有/ notifications /下所有通知(所有用户,待处理和已批准)的主列表,并仅授予对各个通知(/ notifications / $ id)的读访问权限,以便您必须按顺序知道ID阅读通知。
/ / approved_notifications / list只包含已批准通知的通知ID(只需使用ID作为密钥并将值设置为true或类似)。
让/ users / $ user_id / sent_notifications /列表再次包含已批准通知的通知ID。
如果有必要还有/ pending_notifications /列表,那也只包含通知ID。
基本上你有一个主要的通知列表,然后是几个" light"列出"指向"进入那个主列表。由于主列表要求您知道ID以便阅读单个帖子,因此用户无法直接读取列表(您还可以在通知中冗余地存储待处理/已批准的标志,并具有基于以下内容的进一步安全规则如果你想要的话。)