Firebase中对象数组内的查找键

时间:2016-12-11 10:25:08

标签: ios swift firebase firebase-realtime-database

在我的应用程序中,我需要查找联系信息数据的功能,以检查用户是否已存在于我的数据库中。由于用户可能有多个电子邮件地址,因此我将此数据存储在名为ContactInfo的单独类中。

现在,我想查询所有对象,并检查 emails内的ContactInfo数组中是否包含电子邮件。因此,我使用电子邮件作为密钥,这就是为什么它的URL编码。但是,我无法找到正确的查询来实现这一目标。

CONTACTINFO

  • -KYd3pbZ7D - yX6B3HY8
    • 电子邮件
      • john%40gmail%2Ecom:true
      • john%40hotmail%2Ecom:true
    • 名字:约翰
    • 姓:Doe
  • -KYdUDoMVOdUmJ4I3jO-
    • 电子邮件
      • jane%40gmail%2Ecom:true
    • 名字:Jane
    • 姓:Doe

基于我的数据库的顶层看起来像这样

enter image description here

1 个答案:

答案 0 :(得分:2)

使用电子邮件地址作为密钥可能不是您想要做的。

电子邮件地址发生变化并被视为动态数据 - 最佳做法是不使用动态数据(可能会发生变化)作为关键,就像它确实发生变化一样,数据库中引用的任何地方都必须更新。

一种可能性是存储多个电子邮件:

contactInfo
    -KYd3pbZ7D--yX6B3HY8
         firstname: "John"
         lastname: "Doe"
         main_email: "-JYJkjajisaiisd"

然后是所有电子邮件的单独节点。

contact_emails
    -JYJkjajisaiisd
       email : "john@gmail.com"
       uid : "uid_0"
    -YJNlkokaosomdo
       email : "john@hotmail.com",
       uid : "uid_0"
    -Juiaisidiasda
       email : "frank@fmail.com",
       uid : "uid_3"

此结构具有查询性,可维护性,并且无需担心将特殊字符(电子邮件字符)解析/存储为密钥。您可以为每个人存储多封电子邮件,只需更新其contactInfo中的main_email节点即可更改其主电子邮件

要检查电子邮件,请使用此查询

    contactEmailsRef.queryOrdered(byChild:"email")
          .queryEqual(toValue: "john@hotmail.com")
          .observeSingleEvent(of: .value, with: { snapshot in

                print(snapshot)

    })

将导致打印此节点

-YJNlkokaosomdo
     email : "john@hotmail.com",
     uid : "uid_0"