如何提取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 的所有聊天记录,这意味着senderIdrecipientId11。 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中的所有孩子,其中某些部分等于某个字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在Firebase中搜索孩子的值

如何使用 Firebase 实时数据库创建特定用户所有已保存帖子的列表?

如何从孩子(firebase)查询所有孩子的值[重复]

Firebase如何显示孩子未知ID的特定孩子

Firebase如何向所有孩子添加新数据

如何在firebase数据库中获取所有孩子的数据?