在 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 数据库一样,这意味着您需要更改(或扩充)数据结构以满足应用程序的需要。有点不清楚您当前的用例是什么,但我可以看到这些:

  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')查询了。