我需要一个firebase查询来基于数组的值过滤列表。
如果GID(Array)的任何索引包含给定的键。例如,我的密钥是YsGMyfLSGRNHxDWQmhpuPRqtxlq1,而一个节点的GID在第0个索引上具有,而另一个在第1个索引上具有。因此,这两个列表需要返回。
目前,我只能使用代码在第0个索引处获取一个
//userID = YsGMyfLSGRNHxDWQmhpuPRqtxlq1
firebaseDatabase.child("Groups").queryOrdered(byChild: "GID/0").queryEqual(toValue:userID)
当我尝试合并查询时,出现错误。
答案 0 :(得分:0)
我不知道您的数据库结构,但是我可以解释说Firebase Realtime数据库中有一个限制,即您只能按一个孩子订购。 因此,现在如果需要按2个Childs订购,我们可以将2个节点合并为1个节点,并可以通过查询对其应用订单。例如
如果我们有username
和email
字段,我们可以创建一个新字段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
运算符使您可以过滤数组中具有特定值的文档。有关此主题的更多信息,请参见以下文章: