当我试图查询数据库的成员时,出现了以下错误:
FirebaseException (firebase_FirebaseException/索引-未定义索引未定义),在规则中添加".indexOn":"36a72WVw4weQEoXfk3T9gCtOL9n2",用于路径"/members“。
我正在试着检查我的数据库中是否已经与那些成员进行了聊天。这就是我要执行的:
final snapshot = await _database.ref().child("members").orderByChild(firstUserId).equalTo(true).get();这是我的数据库结构

我一直在搜索如何按键索引,但我什么也没找到。我做错什么了吗?我希望你能提前帮我谢谢。
发布于 2022-09-29 17:44:22
键的索引是自动创建的,但在这种情况下,您甚至不需要索引,因为您不是在查询键。
进行这种检查的最简单方法是:
final snapshot = await _database.ref().child("members").child(firstUserId).get();
if (snapshot.value == true) {
...
}所以这里我们不使用查询,而是总是读取快照,然后检查它的值。
不能使用查询的原因是它需要在每个子节点上显式/命名索引。有关这方面的更多信息,请参见我的回答:Firebase query if child of child contains a value
发布于 2022-09-30 14:28:52
当您使用如下结构时:
Firebase-root
|
--- members
|
--- -ND81...kyPL
|
--- 36a7...L9n2: true
|
--- LLhw...vyP2: true实际上,您需要一个查询,因为数据库中的第二个级别(-ND81...kyPL)是动态的。您的方法的问题是,您执行的每个查询都需要一个索引,这是无法完成的,因为您不能为成为成员的每个用户创建一个索引。此外,不能以编程方式创建索引。您需要在Firebase控制台中手动创建它。
确实,您可以将侦听器附加到members节点,并检查结果得到的快照对象中是否存在特定的UID。但在我看来,这个解决方案可以与少量的数据一起使用。如果成员数量增加,则下载整个节点并在客户端上进行验证,这不是推荐的选项。
因为我认为成员最有可能对应于一个组、一个组织或创建它们的用户,那么最好是有一个具有静态的已知值的节点。因此,如果允许您更改数据库模式,我建议如下所示:
Firebase-root
|
--- members
|
--- $uid
|
--- 36a7...L9n2: true
|
--- LLhw...vyP2: true通过这种方式,您可以使用以下方法简单地检查UID是否存在:
final snapshot = await _database.ref().child("members").child(uid).child(firstUserId).get();
if (snapshot.value == true) {
//Your logic.
}但是UID节点可以是任何其他已知ID。
https://stackoverflow.com/questions/73898585
复制相似问题