如何在firebase数据库中获取子集,“如果它们存在”?

时间:2017-06-26 19:47:06

标签: android firebase firebase-realtime-database

我有数据库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/approvednotifications/pending的对象列表,其中的密钥位于“sent_notifications”中。当用户发送通知时,通知数据进入“待定”状态,该通知的密钥存储在“sent_notification”中。审核后,管理员会将数据从待处理节点移至已批准节点。使用任何方法,我发现自己在服务器上进行了大量查询,逐个获取所有节点。我需要一个更好的方法来做到这一点。

我是firebase数据库的新手。这可能不是实现数据库结构的最佳方式。我需要notifications/approved对普通公众可见,notifications/pending/$id仅对发送通知的用户可见。 This是上述结构的参考。如果有更好的方法来实现它,请帮助我。

1 个答案:

答案 0 :(得分:1)

一个选项如下:

  1. 拥有/ notifications /下所有通知(所有用户,待处理和已批准)的主列表,并仅授予对各个通知(/ notifications / $ id)的读访问权限,以便您必须按顺序知道ID阅读通知。

  2. / / approved_notifications / list只包含已批准通知的通知ID(只需使用ID作为密钥并将值设置为true或类似)。

  3. 让/ users / $ user_id / sent_notifications /列表再次包含已批准通知的通知ID。

  4. 如果有必要还有/ pending_notifications /列表,那也只包含通知ID。

  5. 基本上你有一个主要的通知列表,然后是几个" light"列出"指向"进入那个主列表。由于主列表要求您知道ID以便阅读单个帖子,因此用户无法直接读取列表(您还可以在通知中冗余地存储待处理/已批准的标志,并具有基于以下内容的进一步安全规则如果你想要的话。)