Firebase 检查列表中是否存在具有键的节点 问题

Firebase 检查列表中是否存在具有键的节点 问题,firebase,Firebase,我需要在已有的firebase数据结构中进行特殊检查,并想知道这是否可能(或任何解决方法) 因此,目前的结构是: { groups: { group1: { name: "Group one" } group2: { name: "Group two" } }, members: { group1: { "some@email,com": true, "another@email,com": true

我需要在已有的firebase数据结构中进行特殊检查,并想知道这是否可能(或任何解决方法)

因此,目前的结构是:

{
   groups: {
      group1: { name: "Group one" }
      group2: { name: "Group two" }
   },
   members: {
      group1: { 
         "some@email,com": true,
         "another@email,com": true
      },
      group2: { "some@email,com": true }
   }
}
我需要并且可以轻松做到的:

  • 获取特定组中的所有用户
  • 将用户添加到任何特定组
  • 从任何特定组中删除用户
  • 但是我不知道如何进行检查:如果一个有电子邮件的用户是任何组的成员。

    组和成员的数量可能很大,所以我不想加载所有成员对象并手动检查

    我的答案不是最优的 我能找到的唯一方法是再添加一个对象
    用户
    ,并在那里保留可用的组。像这样:

    {
        users: {
           "some@email,com": {
               groups: {
                  group1: true,
                  group2: true
               }
            }
        }
    }
    
    在这种情况下,我可以毫无问题地进行检查,但将再添加一个请求以添加/删除操作(向成员添加电子邮件并向用户添加groupID;从成员中删除电子邮件并从用户中删除groupID)

    谢谢你的帮助。

    这是可以做到的

    例如,给定此结构

    Members
      Group_0
        ben@thing,com: "value"
        jerry@thing,com: @"value"
        frank@thing,com: @"value"
      Group_1
        elmo@thing,com: "value"
        linda@thing,com: "value"
    
    我们构造一个查询如下(ObjC)

    然后查询返回

      Group_1
        elmo@thing,com: "value"
        linda@thing,com: "value"
    
    (最新信息)

    上面提到的缺点是,您正在查找的密钥是动态的(电子邮件),并且没有针对该密钥建立索引的规则,因此Firebase会抱怨

    Using an unspecified index. Consider adding ".indexOn":....etc
    
    这里有一个可能的解决方案:使用这样的节点结构

    emails_node
       random_node_name_0
          email: "jerry@thing.com"
          group: "group_0"
       random_node_name_1
          email: "linda@thing.com"
          group: "group_1"
       random_node_name_2
          email: "elmo@thing.com"
          group: "group_1"
    
    还有一套规则

      "rules": {
        ".read": true,
        ".write": true,
        "emails_node": {
          ".indexOn": "email"
        }
      }
    
    随机_节点_名称_x是由childByAutoId(ObjC)创建的Firebase引用

    然后,查询变为

    FQuery *q1 = [ref queryOrderedByChild:@"email"];
    FQuery *q2 = [q1 queryEqualToValue:@"elmo@thing.com"];
    
    结果是

    email = "elmo@thing.com";
    group = group1;
    
    这里的优点有两个:

    1) 查询将返回电子邮件和组,这样您不仅可以检查重复项,还可以告诉我们它所在的组(如果需要)


    2) 可以使用实际电子邮件值,而不是解析/更改电子邮件。(点)到,

    直接检查节点是否有问题?只需对成员/group1执行
    调用/some@email,com并查看该值是否为
    true
    ?不清楚你的目标是什么。@Kato我想这个想法是想看看是否有一封电子邮件存在于任何群体中,而不仅仅是某个特定群体?@Jay你的想法是对的。我不知道groupID,我需要检查电子邮件是否在任何组中。感谢您的技巧,但在这种情况下,我将收到来自firebase的索引警告。它将使用未指定的索引显示
    。考虑添加“.Noxon”:elmo@thing,com“at/members…
    。我认为我不能接受这个警告,因为团体和成员的数量可能相当大。你对这个索引问题有什么想法吗?
    email = "elmo@thing.com";
    group = group1;