【问题标题】:Retrieve node from firebase without subnode从没有子节点的firebase中检索节点
【发布时间】:2022-02-12 23:51:25
【问题描述】:

我的应用会为用户显示优惠,他可以选择一个并按加入,这会将电子邮件帐户发送到“Joiners”节点。

但是现在我的问题是我希望他通过计算“Joiners”节点来查看有多少人加入,当然,不用下载里面的所有电子邮件。

所以我又想要什么:

  1. 检索“1231qq”节点,不包含“Joiners”节点中的电子邮件。

  2. 计算“Joiners”节点中有多少电子邮件,但不必计算 让用户使用其他用户的电子邮件下载整个节点

我不知道我是否缺少 Firebase 提供的用于进行此类注册的技术或什么,因此我希望在这里得到一些建议,并感谢您的努力。

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database


    【解决方案1】:

    Firebase 实时数据库 SDK 始终加载 JSON 的整个分支。没有办法只获取节点的一部分。

    当您在寻找类似的东西时,这通常意味着您需要注意 Firebase 文档中对never nest multiple entity types under a single node 的建议。例如,您需要将屏幕截图中的数据拆分为两个顶级节点,如下所示:

    Offers: {
      "1231qq": {
        done: 1231,
        name: "...",
        required: 3000,
        url: "..."
      }
    },
    OfferJoiners: {
      "1231qq": {
        1: "Email 1",
        2: "Email 2"
      }
    }
    

    使用上述结构,您可以只加载来自Offers 的没有加入者的报价详细信息。并且在需要时,您执行第二次调用以加载来自OfferJoiners 的加入者。由于Firebase pipelines the requests over a single connection,额外的调用不会造成您想象的那么多开销。

    【讨论】:

    • 我完全同意你关于单个节点下的多个实体类型的观点。这解决了问题,但也许我解释得不够充分,因为我觉得仅仅计算我有多少加入者是有效的,我必须将整个节点下载给用户,即使它不是开销或非常快.我只是更愿意将这些电子邮件尽可能保密,因为我不想首先检索它们。我考虑过在 offer 中创建一个 int 值,这样我就可以使用事务在每次加入时增加这个值,这是一个好习惯吗?
    • 如果您只关心加入者的数量,那将是一个很好的起点。但是,您如何确保每个人只能加入一次(如果这是您的用例所关心的问题)?
    • 老实说,想不出办法。看来我必须检索整个节点才能确保用户只能加入一次。
    • 嗯,这取决于。数组通常不是保证唯一性的正确结构,因为它可以根据定义包含重复项。我建议切换到地图({ "user@domain,com": true, "user2@domain,com": true } 以确保唯一性。请注意其中的, 而不是.,因为键不能包含点(并且方便:电子邮件地址不能包含逗号)。我建议同时检查其中一些,因为我们之前曾多次介绍过唯一性,这可能会有所帮助:stackoverflow.com/…
    • 那肯定行。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多