Android Firebase实时数据库阵列查询问题

Android Firebase实时数据库阵列查询问题,android,ios,swift,firebase,firebase-realtime-database,Android,Ios,Swift,Firebase,Firebase Realtime Database,我需要一个firebase查询来根据数组的值筛选列表 如果GID(数组)的任何索引包含给定的键。e、 g my key是YsGMyfLSGRNHxDWQmhpuPRqtxlq1,一个节点的GID在第0个索引上,另一个节点的GID在第1个索引上。所以这两个列表需要返回 目前,我只能使用代码获取第0个索引处的索引 //userID = YsGMyfLSGRNHxDWQmhpuPRqtxlq1 firebaseDatabase.child("Groups").queryOrdered(byChil

我需要一个firebase查询来根据数组的值筛选列表

如果GID(数组)的任何索引包含给定的键。e、 g my key是YsGMyfLSGRNHxDWQmhpuPRqtxlq1,一个节点的GID在第0个索引上,另一个节点的GID在第1个索引上。所以这两个列表需要返回

目前,我只能使用代码获取第0个索引处的索引

//userID = YsGMyfLSGRNHxDWQmhpuPRqtxlq1
 firebaseDatabase.child("Groups").queryOrdered(byChild: "GID/0").queryEqual(toValue:userID)

当我尝试组合查询时,会出现错误。

我不知道您的数据库结构,但我可以解释,Firebase实时数据库中存在一个限制,您只能按一个孩子订购。 所以现在如果我们需要按2个孩子排序,我们可以组合2个节点,使其成为1个节点,并可以通过查询对其应用排序。比如说

如果我们有
username
email
字段,我们可以创建一个新字段
username\u email
,并可以在其上应用订单

现在我们可以写作了

firebaseDatabase.child("user").queryOrdered(byChild: "username_email").queryEqual(toValue: "john_john@g.com");

我不知道您的数据库结构,但我可以解释Firebase实时数据库有一个限制,您只能按一个孩子订购。 所以现在如果我们需要按2个孩子排序,我们可以组合2个节点,使其成为1个节点,并可以通过查询对其应用排序。比如说

如果我们有
username
email
字段,我们可以创建一个新字段
username\u email
,并可以在其上应用订单

现在我们可以写作了

firebaseDatabase.child("user").queryOrdered(byChild: "username_email").queryEqual(toValue: "john_john@g.com");

无法根据数组中存在的值筛选组。如果要查询数据库以获取特定用户的所有组,则应考虑扩充数据结构以允许反向查找。这意味着您应该在每个用户对象下添加该用户所在的组

这意味着您需要复制一些数据,但对于Firebase来说,这不是问题。这是一种非常常见的做法,它被命名为
非规范化
,为此,我建议您观看此视频

在复制数据时,需要记住一件事。与添加数据的方式相同,您需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方进行

然而,您所需要的实际上是允许在CloudFireStore中使用的。它的
数组包含
运算符,允许您筛选数组中具有特定值的文档。有关此主题的更多信息,请参阅以下帖子:


无法根据数组中存在的值筛选组。如果要查询数据库以获取特定用户的所有组,则应考虑扩充数据结构以允许反向查找。这意味着您应该在每个用户对象下添加该用户所在的组

这意味着您需要复制一些数据,但对于Firebase来说,这不是问题。这是一种非常常见的做法,它被命名为
非规范化
,为此,我建议您观看此视频

在复制数据时,需要记住一件事。与添加数据的方式相同,您需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方进行

然而,您所需要的实际上是允许在CloudFireStore中使用的。它的
数组包含
运算符,允许您筛选数组中具有特定值的文档。有关此主题的更多信息,请参阅以下帖子:


Firebase实时数据库中存在一个限制,您只能按一个子项订购。但是,请分享您的数据库结构,我将尝试给您解决方案。请尝试以下firebaseDatabase.child(“组”).queryOrdered(byChild:“GID”)。queryEqual(toValue:userID)您当前的数据库结构使查找组的GID(用户?)变得很容易。但是,这并不容易找到GID的组。要允许后者,您需要向数据结构添加反向索引:
/GIDS/$gidid/groups/$groupId
。在这里也可以看到我的答案:在Firebase实时数据库中有一个限制,您只能由一个孩子订购。但是,请分享您的数据库结构,我将尝试给您解决方案。请尝试以下firebaseDatabase.child(“组”).queryOrdered(byChild:“GID”)。queryEqual(toValue:userID)您当前的数据库结构使查找组的GID(用户?)变得很容易。但是,这并不容易找到GID的组。要允许后者,您需要向数据结构添加反向索引:
/GIDS/$gidid/groups/$groupId
。在这里也可以看到我的答案:在我的孩子“用户名\电子邮件”中,我只知道“约翰”之前的值。是否有一种方法可以查询“用户电子邮件”是否包含值?就像在Firebase数据库SDK中使用@RöHIT无法查询一样,它也包含了实时数据库SDK的局限性。现在,您可以使用firebase API或编写一个云函数,并在函数中执行所有检查后通过调用云函数获取数据。在我的孩子“username\u email”中,我只知道“john”之前的值。是否有一种方法可以查询“用户电子邮件”是否包含值?就像在Firebase数据库SDK中使用@RöHIT无法查询一样,它也包含了实时数据库SDK的局限性。现在,您可以使用firebase API或编写一个云函数,并在执行函数中的所有检查后通过调用云函数获取数据!你试过我上面的方法吗?如果你认为我的答案对你有帮助,请考虑通过点击复选来接受它。✔️) 在投票箭头下方的左侧。应该将颜色改为绿色。我很感激。谢谢!嗨,RöHIT!你尝试过我上面的解决方案吗?如果你认为我的a