这是我在firebase中的实时数据库的结构
{
"student1" : {
"name" : "somename",
"skillset" : [
"cpp",
"c",
"java"
],
other properties
},
"student2" : {
"name" : "somename",
"skillset" : [
"javascript",
"c",
"python"
],
other properties
},
"student3" : {
"name" : "somename",
"skillset" : [
"cpp",
"java"
],
other properties
},
"student4" : {
"name" : "somename",
"skillset" : [
"java",
"kotlin"
],
other properties
} }
我想找回所有具有特定技能的学生
例如技能= [“ cpp”,“ java”]
那么答案应该是[“ student1”,“ student3”]
答案 0 :(得分:0)
在这种结构下是不可能的,因为firebase仅支持一个孩子进行过滤。 在您的情况下,您需要获取所有数据并按代码进行过滤
答案 1 :(得分:0)
您当前的结构可让您轻松确定用户的技能。然而,这并不容易确定技能的使用者。为此,您需要添加一个反向索引,如下所示:
skills: {
java: {
student1: true,
student3: true,
student4: true
},
kotlin: {
student4: true
}
...
}
使用上述内容,您可以查找用户ID以获得技能,然后从中查找每个用户。有关更多信息,请在这里查看我的答案:Firebase query if child of child contains a value
但这仍然不允许您通过多种技能来查询用户。为此,您必须将技能组合添加到新的数据结构中。例如,具有上述技能,有一个同时了解kotlin和Java的用户:
skills: {
java: {
student1: true,
student3: true,
student4: true
},
java_kotlin: {
student4: true
}
kotlin: {
student4: true
}
...
}
虽然这会导致额外的数据,但是在实践中它的性能相当好,因为您始终可以直接访问所需的数据(因此不需要真正的数据库查询)。