我需要对现有的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
}
}
}
}
在这种情况下,我可以毫无问题地进行检查,但会添加一个添加/删除操作的请求(向成员添加电子邮件并向用户添加groupID;从成员中删除电子邮件并从用户中删除groupID)。
感谢您的帮助。
答案 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)可以使用实际的电子邮件值,而不是解析/更改电子邮件。 (点)到,