检查列表中是否存在带密钥的节点

时间:2015-07-01 09:07:50

标签: firebase

问题

我需要对现有的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 }
   }
}

我需要什么,可以轻松做到:

  1. 获取特定群组中的所有用户
  2. 将用户添加到任何特定群组
  3. 从任何特定群组中删除用户
  4. 但我不知道如何检查:如果有电子邮件的用户是任何群组的成员。

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

    我不是最佳解决方案

    我能找到的唯一方法是再添加一个对象users并在那里保留可用的组。像这样:

    {
        users: {
           "some@email,com": {
               groups: {
                  group1: true,
                  group2: true
               }
            }
        }
    }
    

    在这种情况下,我可以毫无问题地进行检查,但会添加一个添加/删除操作的请求(向成员添加电子邮件并向用户添加groupID;从成员中删除电子邮件并从用户中删除groupID)。

    感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

可以做到

例如,给定此结构

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)

FQuery *q1 = [ref queryOrderedByChild:@"elmo@thing,com"];
FQuery *q2 = [q1 queryEqualToValue:@"value"];

[q2 observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {
    NSLog(@"%@", snapshot.value);
}];

并且查询返回

  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"
    }
  }

random_node_name_x是由childByAutoId(ObjC)创建的Firebase参考

然后查询变为

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

结果是

email = "elmo@thing.com";
group = group1;

这里的优点有两个方面:

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

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