目前我正在尝试 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 警告:使用未指定的索引。考虑将/teams/blue 处的 ".indexOn": "sortTotal"添加到您的安全规则中,以获得更好的性能。
我可以通过将以下内容添加到我的安全规则文件来解决此问题。
"teams": {
"blue": {".indexOn": "sortTotal"},
"red": {".indexOn": "sortTotal"}
}
但是如果我有很多团队或者我的应用程序允许用户添加自己的团队怎么办? 我该如何处理这个问题?
可以全局设置索引吗?例如,对于这个数据库,我想要在所有节点上使用 sortTotal
字段设置索引。或者您可以在父级别执行此操作,例如
"teams": {".indexOn": "sortTotal"}
是否也适用于所有团队节点而无需单独指定? (我尝试了这个,但似乎不起作用)
最佳答案
排序和索引只能向下一级进行通配符操作。由于您为 sortTotal
定义了索引上/teams
,它只会索引 sortTotal
值为 /teams/red
和/teams/blue
.
与 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')
进行查询.
关于javascript - 在 firebase 中按比例指定索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36516375/