在 Firebase 中按比例指定索引
Specifying index at scale in firebase
目前我正在尝试orderByChild
查看下面的一些示例数据。
{
"teams": {
"blue":{
"tomsmith":{
"firstName":"Tom",
"lastName":"Smith",
"sortTotal":-433,
"total":433
},
"bobsmith":{
"firstName":"Bom",
"lastName":"Smith",
"sortTotal":-133,
"total":133
}
},
"red":{
"tomkelly":{
"firstName":"Tom",
"lastName":"Kelly",
"sortTotal":-1433,
"total":1433
},
"davekelly":{
"firstName":"Dave",
"lastName":"Kelly",
"sortTotal":-99,
"total":99
}
}
}
}
当我查看控制台时,我收到以下消息。
FIREBASE WARNING: Using an unspecified index. Consider adding ".indexOn": "sortTotal" at /teams/blue to your security rules for better performance.
我可以通过将以下内容添加到我的安全规则文件来解决这个问题。
"teams": {
"blue": {".indexOn": "sortTotal"},
"red": {".indexOn": "sortTotal"}
}
但是如果我有很多团队,或者如果我的应用程序允许用户添加他们自己的团队怎么办?
我该如何处理?
可以全局设置索引吗?例如,对于这个数据库,我希望在所有具有 sortTotal
字段的节点上设置一个索引。或者您可以在父级别执行此操作,例如
"teams": {".indexOn": "sortTotal"}
是否也适用于所有团队节点而不单独指定? (我试过了,好像不行)
排序和索引仅适用于下一级通配符。由于您在 /teams
上为 sortTotal
定义了一个索引,它只会为 /teams/red
和 /teams/blue
.
索引 sortTotal
值
与 NoSQL 数据库一样,这意味着您需要更改(或扩充)数据结构以满足应用程序的需要。有点不清楚您当前的用例是什么,但我可以看到这些:
- 哪支球队的球员得分最高
sortTotal
?
- 所有球队中哪个球员的得分最高
sortTotal
?
- 团队
red
中哪位球员的得分最高 sortTotal
?
哪支球队的球员得分最高sortTotal
?
对于情况 1,您可以为每个团队添加 highSortTotalValue
和 highestSortTotalPlayer
。
"teams": {
"blue":{
"highSortTotalValue":-433,
"highestSortTotalPlayer": "tomsmith"
},
"red":{
"highSortTotalValue":-1433,
"highestSortTotalPlayer": "tomkelly"
}
}
您可以在 /teams
上索引它,然后查询 ref.child('teams').orderByChild('highSortTotalValue').on(...
。
所有球队中哪个球员的得分最高 sortTotal
?
如果您想知道所有球队球员的排序总数,您需要为每个球员保留一个这些值的列表:
"playerSortTotals": {
"tomsmith": -433,
"tomkelly": -1433,
"bomsmith": -133,
"davekelly": -99
}
现在您可以为 /playerSortTotals
添加索引,并找到 ref.child('playerSortTotals').orderByValue()...
的最高排序总数
团队 red
中哪位球员的得分最高 sortTotal
?
这可以通过您当前的数据结构实现。首先,您需要为每个团队添加一个索引:
"teams": {
"$teamid": {
"$playerid": {
".indexOn": "sortTotal"
}
}
}
此索引为每个团队填充,并包含该团队每个球员的 sortTotal
。
有了这个索引,你就可以用ref.child('teams/red').orderByChild('sortTotals')
查询了。
目前我正在尝试orderByChild
查看下面的一些示例数据。
{
"teams": {
"blue":{
"tomsmith":{
"firstName":"Tom",
"lastName":"Smith",
"sortTotal":-433,
"total":433
},
"bobsmith":{
"firstName":"Bom",
"lastName":"Smith",
"sortTotal":-133,
"total":133
}
},
"red":{
"tomkelly":{
"firstName":"Tom",
"lastName":"Kelly",
"sortTotal":-1433,
"total":1433
},
"davekelly":{
"firstName":"Dave",
"lastName":"Kelly",
"sortTotal":-99,
"total":99
}
}
}
}
当我查看控制台时,我收到以下消息。
FIREBASE WARNING: Using an unspecified index. Consider adding ".indexOn": "sortTotal" at /teams/blue to your security rules for better performance.
我可以通过将以下内容添加到我的安全规则文件来解决这个问题。
"teams": {
"blue": {".indexOn": "sortTotal"},
"red": {".indexOn": "sortTotal"}
}
但是如果我有很多团队,或者如果我的应用程序允许用户添加他们自己的团队怎么办? 我该如何处理?
可以全局设置索引吗?例如,对于这个数据库,我希望在所有具有 sortTotal
字段的节点上设置一个索引。或者您可以在父级别执行此操作,例如
"teams": {".indexOn": "sortTotal"}
是否也适用于所有团队节点而不单独指定? (我试过了,好像不行)
排序和索引仅适用于下一级通配符。由于您在 /teams
上为 sortTotal
定义了一个索引,它只会为 /teams/red
和 /teams/blue
.
sortTotal
值
与 NoSQL 数据库一样,这意味着您需要更改(或扩充)数据结构以满足应用程序的需要。有点不清楚您当前的用例是什么,但我可以看到这些:
- 哪支球队的球员得分最高
sortTotal
? - 所有球队中哪个球员的得分最高
sortTotal
? - 团队
red
中哪位球员的得分最高sortTotal
?
哪支球队的球员得分最高sortTotal
?
对于情况 1,您可以为每个团队添加 highSortTotalValue
和 highestSortTotalPlayer
。
"teams": {
"blue":{
"highSortTotalValue":-433,
"highestSortTotalPlayer": "tomsmith"
},
"red":{
"highSortTotalValue":-1433,
"highestSortTotalPlayer": "tomkelly"
}
}
您可以在 /teams
上索引它,然后查询 ref.child('teams').orderByChild('highSortTotalValue').on(...
。
所有球队中哪个球员的得分最高 sortTotal
?
如果您想知道所有球队球员的排序总数,您需要为每个球员保留一个这些值的列表:
"playerSortTotals": {
"tomsmith": -433,
"tomkelly": -1433,
"bomsmith": -133,
"davekelly": -99
}
现在您可以为 /playerSortTotals
添加索引,并找到 ref.child('playerSortTotals').orderByValue()...
团队 red
中哪位球员的得分最高 sortTotal
?
这可以通过您当前的数据结构实现。首先,您需要为每个团队添加一个索引:
"teams": {
"$teamid": {
"$playerid": {
".indexOn": "sortTotal"
}
}
}
此索引为每个团队填充,并包含该团队每个球员的 sortTotal
。
有了这个索引,你就可以用ref.child('teams/red').orderByChild('sortTotals')
查询了。