【问题标题】:Querying a child of email id when email id is the key in Firebase, to check if the child exists or not当电子邮件ID是Firebase中的键时查询电子邮件ID的孩子,以检查孩子是否存在
【发布时间】:2017-09-05 11:22:24
【问题描述】:

我在 Android 中有一个 Firebase 数据库,其中我有根“USERS”,并且有多个用户将密钥作为电子邮件 ID。

所以数据库的架构是这样的,数据库使用电子邮件 ID 作为每个用户的主键:

{
  "USERS":
    { "ABC@GMAIL,COM" : 
      { "USERNAME": "abc",
        "URL": "SOME_URL",...
      }
    }
    { "DEF@GMAIL,COM" :
      { "USERNAME": "dfe",
        "URL": "SOME_URL2",...
      }
    }
    .......
    .......
    .......
}

现在电子邮件 ID 用作每个用户的主键。在电子邮件 ID 中是我想要查询的用户名键。我想检查用户名是否存在? 所以通常的方法是有一个数据库参考——像这样——

DatabaseReference mDBRef = FirebaseDatabase.getInstance().getReference("/USERS/" +  ???? + "/USERNAME");

然后在数据库引用上添加一个值事件监听器。在dataSnapshot中检查它是否存在-

dataSnapshot.exists()

现在我不知道在“USERS”之后添加什么。此外,我希望数据库查询搜索用户名尽可能高效。遍历电子邮件 ID 并检查电子邮件 ID 的子键是否存在的可能方法是什么?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    您可以使用 orderByChild() 函数过滤结果

    databasereference.orderByChild("USERNAME").equal("whatever")
    

    为了获得完整的性能,在 firebase 数据库规则中添加 .indexOn 属性

    rules{
        //other rules
        "USERS":{
            ".indexOn":["USERNAME"]
        }
    }
    

    【讨论】:

    • 是的,但在此之前,我需要迭代用户名的父级,即电子邮件 ID。而且我不知道该怎么做,因为电子邮件 ID 是关键。
    • 你为什么需要激怒?此查询将仅返回带有所需用户名的结果。
    • 如果没有结果说明用户名不存在,否则你会得到一个datasnapsot并且可以通过datasnapsot.getKey()提取email id
    • 因为当我 orderByChild databasereference.orderByChild("USERNAME").equal("whatever") 时,我得到了整个数据库,其中键变为“USERS”,值将是具有子项的整个对象"USERNAME"。因此 orderByChild("USERNAME").equal("whatever") 永远不会是真的。
    • 孩子给我的最好的命令是整个对象。我可以通过引用我的“USERS”而无需做 orderByChild,因为我已经有了这样设计的数据库模式。但无论如何谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 2021-03-12
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2016-09-18
    相关资源
    最近更新 更多