【问题标题】:How to add indexOn a userId in firebase database如何在firebase数据库中添加indexOn userId
【发布时间】:2020-08-22 01:22:01
【问题描述】:

我收到一个错误

使用未指定的索引。您的数据将在客户端下载和过滤。考虑将 /Products 处的 ".indexOn": "WkJymEhTtvgtIzQZZxs3VUTbmLh2quan" 添加到您的安全规则中以获得更好的性能。

这是我的代码:

firebase.database().ref("Products").orderByChild(user.uid + "quan").startAt(0).on('value', function (s) {
        var cartNum = 0;
        s.forEach(function (d) {
          console.log(d.child(user.uid + "quan").val());
          cartNum += d.child(user.uid + "quan").val();
        });
        $("#cartCount").text(cartNum);
      });

我正在尝试在我的 firebase 数据库中查询具有 user.uid+ 'quan' 的产品

这是我的 JSON 的结构 ---->>>

如果有人可以帮助我,非常感谢

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    如索引数据文档和错误消息中所述,您需要在控制台中为您的数据库的 Firebase 规则添加索引:

    {
      "rules": {
        "Products": {
          ".indexOn": "WkJymEhTtvgtIzQZZxs3VUTbmLh2quan"
        }
      }
    }
    

    这将解决当前用户的错误消息。问题是您需要为每个 UID 显式声明这样的索引,除非您考虑到一组特定的用户,否则这是不可行的。

    潜在的问题是,您当前的数据结构可以很容易地找到给定产品的用户,但它并不容易找到特定用户的产品。为了允许后一种用例,您需要为该反向映射添加一个额外的数据结构,有时称为反向或反向索引:

    "Users": {
      "uid1": {
        "productId1": true,
        "productId2": true
      },
      "uid2": {
        "productId3": true,
        "productId4": true
      }
    }
    

    虽然这会复制一些数据,但它允许您在两个方向上查找相关数据。这种允许用例的数据复制类型在 NoSQL 数据库中很常见。

    另见:

    【讨论】:

    • 好的,我会试试这个,解决后回复你,谢谢
    • 我为购物车项目创建了另一个索引,并在我的安全规则中添加了一些通配符 $unknown 以跳过动态节点,非常感谢
    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 2018-03-04
    • 1970-01-01
    • 2017-10-23
    • 2021-08-19
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多