检查列表中是否存在具有键的节点
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 }
}
}
我需要并且可以轻松做到的:
- 获取特定组中的所有用户
- 将用户添加到任何特定组
- 从任何特定组中删除用户
但我不知道如何进行检查:如果拥有某些电子邮件的用户是任何组的成员。
组和成员的数量可能很大,所以我不想加载所有成员对象并手动检查。
我的不是最优解
我能找到的唯一方法是再添加一个对象 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 来自 的电子邮件。 (点)到 ,
问题
我需要对现有的 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
并在那里保留可用组。像这样:
{
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 来自 的电子邮件。 (点)到 ,