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

时间:2019-05-30 09:30:52

标签: android ios swift firebase firebase-realtime-database

我需要一个firebase查询来基于数组的值过滤列表。

enter image description here

如果GID(Array)的任何索引包含给定的键。例如,我的密钥是YsGMyfLSGRNHxDWQmhpuPRqtxlq1,而一个节点的GID在第0个索引上具有,而另一个在第1个索引上具有。因此,这两个列表需要返回。

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

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

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

2 个答案:

答案 0 :(得分:0)

我不知道您的数据库结构,但是我可以解释说Firebase Realtime数据库中有一个限制,即您只能按一个孩子订购。 因此,现在如果需要按2个Childs订购,我们可以将2个节点合并为1个节点,并可以通过查询对其应用订单。例如

如果我们有usernameemail字段,我们可以创建一个新字段username_email并对其应用订单。

喜欢

user: {
     username: "john",
     email: "john@g.com"
     username_email = "john_john@g.com"
}

现在我们可以写

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

答案 1 :(得分:0)

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

这意味着您需要复制一些数据,但这对于Firebase来说不是问题。这是一种非常普遍的做法,命名为denormalization,为此,我建议您观看此视频Denormalization is normal with the Firebase Database

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

但是,Cloud Firestore实际上允许您需要什么。其array-contains运算符使您可以过滤数组中具有特定值的文档。有关此主题的更多信息,请参见以下文章: