javascript - 在 firebase 中按比例指定索引

标签 javascript firebase firebase-security firebase-realtime-database

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

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

关于javascript - 在 firebase 中按比例指定索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36516375/

相关文章:

Javascript:如何处理数组过滤器操作中的 jQuery.ajax 函数调用?

PHP 标签中的 JavaScript 确认框不断返回 TRUE

javascript - 以 Bootstrap 样式显示自定义验证错误

ios - Firebase-Unity 项目 : Exporting for iOS on Windows 10. 解决方法?

firebase - 如何从cloud firestore获取数据,其中user.uid等于flutter中的文档ID?

firebase - Firestore 数据库规则 : Permissions for Queries

JavaScript/jQuery - 获取文本并翻译它

firebase - 如何设置Firestore安全规则?资源.数据 : Null value error

实时信使移动应用的 Firebase 安全规则

firebase - Flutter web : tried to call a non-function, 比如null : 'dart. global.firebase.storage