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