首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RealtimeDB按键索引数据

RealtimeDB按键索引数据
EN

Stack Overflow用户
提问于 2022-09-29 16:06:08
回答 2查看 77关注 0票数 1

当我试图查询数据库的成员时,出现了以下错误:

FirebaseException (firebase_FirebaseException/索引-未定义索引未定义),在规则中添加".indexOn":"36a72WVw4weQEoXfk3T9gCtOL9n2",用于路径"/members“。

我正在试着检查我的数据库中是否已经与那些成员进行了聊天。这就是我要执行的:

代码语言:javascript
复制
final snapshot = await _database.ref().child("members").orderByChild(firstUserId).equalTo(true).get();

这是我的数据库结构

我一直在搜索如何按键索引,但我什么也没找到。我做错什么了吗?我希望你能提前帮我谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-29 17:44:22

键的索引是自动创建的,但在这种情况下,您甚至不需要索引,因为您不是在查询键。

进行这种检查的最简单方法是:

代码语言:javascript
复制
final snapshot = await _database.ref().child("members").child(firstUserId).get();
if (snapshot.value == true) {
  ...
}

所以这里我们不使用查询,而是总是读取快照,然后检查它的值。

不能使用查询的原因是它需要在每个子节点上显式/命名索引。有关这方面的更多信息,请参见我的回答:Firebase query if child of child contains a value

票数 1
EN

Stack Overflow用户

发布于 2022-09-30 14:28:52

当您使用如下结构时:

代码语言:javascript
复制
Firebase-root
  |
  --- members
       |
       --- -ND81...kyPL
             |
             --- 36a7...L9n2: true
             |
             --- LLhw...vyP2: true

实际上,您需要一个查询,因为数据库中的第二个级别(-ND81...kyPL)是动态的。您的方法的问题是,您执行的每个查询都需要一个索引,这是无法完成的,因为您不能为成为成员的每个用户创建一个索引。此外,不能以编程方式创建索引。您需要在Firebase控制台中手动创建它。

确实,您可以将侦听器附加到members节点,并检查结果得到的快照对象中是否存在特定的UID。但在我看来,这个解决方案可以与少量的数据一起使用。如果成员数量增加,则下载整个节点并在客户端上进行验证,这不是推荐的选项。

因为我认为成员最有可能对应于一个组、一个组织或创建它们的用户,那么最好是有一个具有静态的已知值的节点。因此,如果允许您更改数据库模式,我建议如下所示:

代码语言:javascript
复制
Firebase-root
  |
  --- members
       |
       --- $uid
             |
             --- 36a7...L9n2: true
             |
             --- LLhw...vyP2: true

通过这种方式,您可以使用以下方法简单地检查UID是否存在:

代码语言:javascript
复制
final snapshot = await _database.ref().child("members").child(uid).child(firstUserId).get();
if (snapshot.value == true) {
    //Your logic.
}

但是UID节点可以是任何其他已知ID。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73898585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档