【问题标题】:How indexOn works in firebase-database?indexOn 如何在 firebase-database 中工作?
【发布时间】:2017-07-03 13:23:38
【问题描述】:

我的数据库如下所示:

"users": {
    "2387653478": {
        "score": 1000,
        ...
    },
    "8456756547": {
        "score": 2000,
        ...
    },
    ...
}

我想按“分数”做一个简单的排名排序,但是我有很多用户,我应该在规则中添加一个 indexOn 来优化:

"rules": {
    "users": {
        "$user": {
            ".read": "auth != null",
            ".write": "auth != null && auth.token.firebase.identities['facebook.com'][0] === $user",
            ".indexOn": ["score"]
        }
    }
}

仅在规则中添加 indexOn 时优化是否 100% 起作用? 添加 indexOn 之前创建的用户呢?

提前致谢!

【问题讨论】:

    标签: firebase firebase-realtime-database firebase-security


    【解决方案1】:

    当您更新规则文件(通过Firebase Database console 或通过 CLI)时,Firebase 数据库(重新)创建规则中定义的所有索引。它对所有现有数据执行此操作,然后继续为任何数据更改更新这些索引。

    但是您在错误的级别上定义了索引。您希望允许在单个用户的分数上查询 users 节点。所以你必须在users上定义索引:

    "rules": {
        "users": {
            ".read": "auth != null",
            ".indexOn": ["score"]
            "$user": {
                ".write": "auth != null && auth.token.firebase.identities['facebook.com'][0] === $user",
            }
        }
    }
    

    您会注意到,我还将您的 .read 规则移至 users。因为没有它,您将没有/users 的读取权限,因此无法查询它。

    【讨论】:

    • 感谢您的快速回复! “娱乐”过程将需要几秒钟。如果当时数据库收到用户修改请求,会不会有问题?
    • 如果您遇到问题,请提供重现这些问题的步骤。
    • 我要求防止来自当前用户的问题。暂时没有问题。谢谢!
    • 如果 [score] 不止一次嵌套在用户内部的不同位置怎么办? FB怎么知道索引在哪一处?
    • users 的每个子节点只能有一个子属性score。这就是 Firebase 使用上述规则索引的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2017-01-07
    • 2016-01-17
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    相关资源
    最近更新 更多