要从Firebase数据库检索值吗?

时间:2019-01-26 21:48:41

标签: firebase firebase-realtime-database

这是我在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”]

2 个答案:

答案 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
  }
  ...
}

虽然这会导致额外的数据,但是在实践中它的性能相当好,因为您始终可以直接访问所需的数据(因此不需要真正的数据库查询)。