在防火分区中按比例指定索引

Specifying index at scale in firebase

本文关键字:索引 按比例 分区      更新时间:2024-04-18

目前我正在尝试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/bluesortTotal值编制索引。

与NoSQL数据库一样,这意味着您需要更改(或扩充)数据结构以适应应用程序的需要。目前还不清楚您当前的用例是什么,但我可以看到这些:

  1. 哪个球队的球员sortTotal最高
  2. 所有球队中哪个球员的sortTotal最高
  3. red队中哪个球员的sortTotal最高

哪个球队的球员sortTotal最高

对于案例1,您可以为每个团队添加一个highSortTotalValuehighestSortTotalPlayer

"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')进行查询。