【问题标题】:Firebase database StartAt RulesFirebase 数据库 StartAt 规则
【发布时间】:2020-05-21 07:37:55
【问题描述】:

我正在尝试对我的 firebase 数据库进行查询

我当前数据库的结构如下

查询如下(工作正常):

firebase.database().ref('/users/'+id).orderByValue().endAt(7000).once('value').then(......

为了避免必须从节点下载所有数据并在客户端处理查询,我必须创建规则。现在我有这个:

"users": {
     "$id": {
         ".indexOn": ".value"
     }
}

我的问题是:使用此规则,我的查询将只下载必要的内容,还是我必须添加诸如 ".indexOn": ".value> 7000" 之类的其他内容才能提高效率?

【问题讨论】:

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


    【解决方案1】:

    您需要在 JSON 中要执行它们的级别上定义索引和查询。由于您要查询用户的价值,因此索引如下所示:

    {
      "rules": {
        "users": {
           ".indexOn": ".value"
         }
      }
    }
    

    因此,这在/users 上定义了一个索引,然后您可以在其中根据其值对其子节点进行排序/过滤。

    然后你可以查询它:

    firebase.database()
      .ref('/users')
      .orderByValue()
      .endAt(7000)
      .once('value')
      .then(function(results) {
        results.forEach(function(snapshot) {
          console.log(snapshot.key+": "+snapshot.val());
        });
      })
    

    如果你想确保这里没有额外的数据被读取,你可以做两件事

    1. 查看 JavaScript 控制台,它会在缺少索引时显式记录。
    2. 查看浏览器网络控制台中的 Web Socket 选项卡,您可以在其中准确查看 Firebase 正在发送的数据。

    【讨论】:

      【解决方案2】:

      不,只是说.value 就足够了。事实上,你所提议的甚至没有价值。整个子名称范围都将使用.value 进行索引。

      【讨论】:

        猜你喜欢
        • 2017-07-15
        • 2020-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-17
        • 2021-01-31
        相关资源
        最近更新 更多