首页 > 解决方案 > 在更深的嵌套项上使用 indexOn 的问题

问题描述

在此处输入图像描述我在 stackoverflow 上进行了很多搜索并阅读了很多问题 我有 3 个 indexOn 问题其中 2 个已解决,剩下 1 个我正在对数据库进行排序,并且在“favorite”和“poet”上有 indexOn,它们运行成功,但我需要一个 indexOn心脏节点内的数字。查询运行成功,但我在 android studio 中收到 indexOn 警告

我尝试在数据库规则中使用变量代替数字,但仍然收到警告

使用未指定的索引。您的数据将在客户端下载和过滤。考虑将 '".indexOn": "heart/+91916*******"' at gazal 添加到您的安全和 Firebase 数据库规则中以获得更好的性能

queryFav = FirebaseDatabase.getInstance()
             .getReference(reference).orderByChild(child).equalTo("heart");

上面的查询运行成功,但 indexOn 规则应该是什么

标签: javaandroidfirebase-realtime-database

解决方案


您收到的消息意味着您正在运行一个orderBy("heart/+91916*******")在名为 的节点上的查询gazal。为了有效地运行该查询,您需要heart/+91916*******在安全规则中对该节点建立索引。但是由于该+91916*******索引的一部分可能是动态的(即,+91916*******对于应用程序的每个用户,您将拥有不同的值),因此您必须为每个用户添加一个索引。这是不可行的。

换句话说:您当前的数据结构可以轻松阅读对特定诗歌感兴趣的用户。然而,确定特定用户所喜爱的诗歌并不容易。为了同样简单,您需要添加一个额外的数据结构”

"user_hearts": {
  "+91916*******": {
    "-KjYiXzl1ancR8Pi3MfQ": true
  }
}

通过上述结构,您可以轻松地user_hearts为您感兴趣的用户读取节点,然后在需要时一一阅读诗歌。

另见:


推荐阅读