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

Check if a node with a key exists in a list

问题

我需要对现有的 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. 从任何特定组中删除用户

但我不知道如何进行检查:如果拥有某些电子邮件的用户是任何组的成员。

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

我的不是最优解

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

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

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

感谢您的帮助。

可以做到

例如,给定这个结构

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);
}];

和查询 returns

  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) 查询 returns 电子邮件和组,因此您不仅可以检查重复项,还可以告诉我们它在哪个组中(如果需要)

2) 可以使用实际的电子邮件值代替 parsing/changing 来自 的电子邮件。 (点)到 ,