如何提取firebase中的所有孩子,其中某些部分等于某个字符串
Posted
技术标签:
【中文标题】如何提取firebase中的所有孩子,其中某些部分等于某个字符串【英文标题】:how to extract all child in firebase with certain part of the id iqual to some string 【发布时间】:2018-08-16 21:10:47 【问题描述】:拥有this firebase structure 我如何仅检索子密钥几乎具有当前用户ID 的聊天子项。 聊天子id是这样的11-126
所以假设 mi 用户 id us 11。我想用 - 的任何一侧具有 11 的所有 it 数据检索所有孩子。如果有一个 89-11 o 253-11 o 11-254 的孩子,我想检索所有这些孩子。 现在我正在检索所有孩子并观察 key 是否包含我对此代码感兴趣的 id。
chatsRef.observe(.childAdded, with: [weak self] snapshot in
if snapshot.key.contains(String(requestManager.instance.user.id!))
if let data = snapshot.value as? [String: Any]
let id = data["id"] as! String
let name = data["name"] as! String
let message = data["body"] as? String
let senderId = data["senderId"] as! String
let url = self?.rootRef.child("user").child(senderId).value(forKey: "url") as? String
)
转换为 Dictionary 后出现错误。
线程 1:致命错误:打开包装时意外发现 nil 可选值。
数据值是这个。
似乎 data["0"].value wourl 工作,但它没有。知道如何提取添加的孩子的所有值
【问题讨论】:
【参考方案1】:听起来您想检索用户11
的所有聊天记录,这意味着senderId
或recipientId
是11
。 Firebase 实时数据库无法进行这种类型的 OR 查询,它仅支持对单个属性的查询。
相反,向您的 JSON 添加一个数据结构,用于保存每个用户 ID 的聊天室 ID。所以:
"userChats":
"11":
"11-126": true
"126":
"11-126": true
使用这个额外的数据结构,您可以轻松地在/userChats/$uid
下查找用户的聊天室,然后为他们加载单独的聊天室。
【讨论】:
感谢重播,但我无法更改数据结构,我不是为我创建的,所以我必须使用它来与 android 应用程序交互,从而解决问题很奇怪的方式。问题是我不想卸载所有聊天子项,然后快速解析以检索与某些用户 ID 匹配的内容,因为聊天中有 50000 个子项,这将是非常昂贵的网络操作。 在 NoSQL 数据库上,您通常会针对应用的用例扩展和修改数据模型。您需要实现原始数据库作者没有为其设计数据模型的功能。因此:您将需要修改数据库模型以有效地允许新的用例。如果您不想这样做,实现用例的唯一方法是下载所有数据。没有第三个选项可以在不更改/增加数据的情况下为您提供所需的内容 要获得好的入门知识,请阅读 NoSQL data modeling 并观看 Firebase for SQL developers。以上是关于如何提取firebase中的所有孩子,其中某些部分等于某个字符串的主要内容,如果未能解决你的问题,请参考以下文章