Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

将数据编入索引

Firebase 允许您使用任意子键对数据进行临时查询。如果您事先知道您的索引将是什么样子,您可通过 Firebase Realtime Database 安全规则中的 .indexOn 规则来定义索引,以改善查询性能。

定义数据索引

Firebase 提供了强大的工具供您对数据进行排序查询。尤其值得一提的是,Firebase 允许您使用任何常见子键对节点集合进行临时查询。但随着应用的规模不断发展,这种查询的性能会逐步降低。但是,如果您告诉 Firebase 您将查询的键,Firebase 将在服务器上将这些键编入索引,从而改善查询的性能。

使用 orderByChild 编制索引

要介绍这一操作,最简单的方式是举例说明。Firebase 团队的所有成员都觉得恐龙很酷。以下是摘自恐龙信息示例数据库中的代码片段。我们将使用该代码片段来解释 .indexOn 如何与 orderByChild() 搭配使用。

{
  "lambeosaurus": {
    "height" : 2.1,
    "length" : 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "height" : 4,
    "length" : 9,
    "weight" : 2500
  }
}

假设在我们的应用中,我们经常需要按照名字、高度和长度来对恐龙进行排序,而从不会按照重量排序。我们可以通过告诉 Firebase 这些信息来改善查询性能。由于恐龙的名字本身就是键,Firebase 已经优化了通过恐龙名字进行的查询,因为这是已经记录在案的键。我们可以使用 .indexOn 告诉 Firebase 也优化使用高度和长度进行的查询:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

与其他规则一样,您可以在规则的任何层级指定 .indexOn 规则。在上例中,我们将其置于根目录一级,因为所有恐龙数据都存储在数据库的根目录下。

使用 orderByValue 编制索引

在此示例中,我们将演示如何将 .indexOnorderByValue() 搭配使用。比方说,我们正在使用以下数据制作一个恐龙体育成绩排行榜:

{
  "scores": {
    "bruhathkayosaurus" : 55,
    "lambeosaurus" : 21,
    "linhenykus" : 80,
    "pterodactyl" : 93,
    "stegosaurus" : 5,
    "triceratops" : 22
  }
}

由于我们使用 orderByValue() 制作排行榜,我们可以通过在 /scores 节点上添加 .value 规则来优化查询:

{
  "rules": {
    "scores": {
      ".indexOn": ".value"
    }
  }
}