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"
}
}
}