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 编制索引
在此示例中,我们将演示如何将 .indexOn
与 orderByValue()
搭配使用。比方说,我们正在使用以下数据制作一个恐龙体育成绩排行榜:
{ "scores": { "bruhathkayosaurus" : 55, "lambeosaurus" : 21, "linhenykus" : 80, "pterodactyl" : 93, "stegosaurus" : 5, "triceratops" : 22 } }
由于我们使用 orderByValue() 制作排行榜,我们可以通过在 /scores
节点上添加 .value
规则来优化查询:
{ "rules": { "scores": { ".indexOn": ".value" } } }