Firebase实时数据库数组查询问题[重复]
Posted
技术标签:
【中文标题】Firebase实时数据库数组查询问题[重复]【英文标题】:Firebase Realtime database Array query issue [duplicate] 【发布时间】:2019-10-15 22:39:42 【问题描述】:我需要一个 firebase 查询来根据数组的值过滤列表。
如果 GID(Array) 的任何索引包含给定的键。例如,我的键是 YsGMyfLSGRNHxDWQmhpuPRqtxlq1,一个节点的 GID 在第 0 个索引上,其他在第一个索引上。所以需要返回这两个列表。
目前,我只能使用代码获取第 0 个索引处的那个
//userID = YsGMyfLSGRNHxDWQmhpuPRqtxlq1
firebaseDatabase.child("Groups").queryOrdered(byChild: "GID/0").queryEqual(toValue:userID)
当我尝试合并查询时出现错误。
【问题讨论】:
Firebase 实时数据库有一个限制,您只能订购 1 个孩子。但是请分享您的数据库结构,我会尽力为您提供解决方案。 请试试这个 firebaseDatabase.child("Groups").queryOrdered(byChild: "GID").queryEqual(toValue:userID) 您当前的数据库结构可以轻松找到组的 GID(用户?)。然而,找到 GID 的组并不容易。要允许后者,您需要在数据结构中添加一个反向索引:/GIDS/$gidid/groups/$groupId
。也可以在这里查看我的答案:***.com/questions/27207059/… 和这里:***.com/questions/40656589/…
【参考方案1】:
我不知道您的数据库结构,但我可以解释一下 Firebase Realtime 数据库有一个限制,您只能订购 1 个孩子。 所以现在如果我们需要按 2 个子节点排序,我们可以组合 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");
【讨论】:
在孩子“username_email”的情况下,我只知道 _ 之前的值,比如“john”。有没有一种方法可以查询“user_email”是否包含值 john?就像用_分开一样。 在我们无法查询的 Firebase 数据库 SDK 中没有 @RöHIT,它对实时数据库 SDK 的限制。现在,您可以使用 firebase API 或编写云函数并通过在函数中执行所有检查后调用云函数来获取数据。【参考方案2】:您无法根据数组中存在的值过滤您的组。如果您想查询您的数据库以获取特定用户所属的所有组,那么您应该考虑扩充您的数据结构以允许反向查找。这意味着您应该在每个用户对象下添加该用户所在的组。
这意味着您需要复制一些数据,但对于 Firebase,这不是问题。这是一种非常常见的做法,名为denormalization
,为此,我建议您观看此视频,Denormalization is normal with the Firebase Database。
当您复制数据时,需要牢记一件事。与添加数据的方式相同,您需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做。
但是,Cloud Firestore 中实际上允许您需要的内容。它的array-contains
运算符允许您过滤在数组中具有特定值的文档。有关此主题的更多信息,请参阅以下帖子:
【讨论】:
嗨,RöHIT!您是否尝试过我上面的解决方案?如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。我会很感激的。谢谢!以上是关于Firebase实时数据库数组查询问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Flutter - 从特定值中删除数据,Firebase 实时数据库 [重复]
在 Angular 服务中 HTTP.get 之后从 firebase 返回的重复数组
加载 Firebase 实时数据库时的 ProgressBar [重复]